2014-06-06 26 views
7

W pewnym kontekście pracuję nad aplikacją ASP.NET MVC 5, która wykorzystuje uwierzytelnianie oparte na OAuth przez implementację OWIN firmy Microsoft, tylko na Facebooku i Google. etap. Obecnie (od v3.0.0, git-commit 4932c2f), przy czym FacebookAuthenticationOptions i GoogleOAuth2AuthenticationOptions nie zapewniają żadnego majątku, aby wymusić Facebooka ani Google odpowiednio do ponownego uwierzytelnienia użytkowników (poprzez dodanie odpowiednich parametrów ciąg kwerendy) podczas logowania.ASP.NET MVC próbuje załadować starszą wersję zestawu Owin

początkowo wybrałem się do zastąpienia następujących klas:

  • FacebookAuthenticationOptions
  • GoogleOAuth2AuthenticationOptions
  • FacebookAuthenticationHandler (konkretnie AuthenticateCoreAsync())
  • GoogleOAuth2AuthenticationHandler (konkretnie AuthenticateCoreAsync())

jeszcze odkrył, że ~AuthenticationHandler klasy są oznaczone jako internal.

Więc wyciągnąłem kopię źródła projektu Katana (http://katanaproject.codeplex.com/) i odpowiednio zmodyfikowałem źródło.

Po kompilacji, stwierdziliśmy, że istnieje wiele zależności, które wymagają aktualizacji w celu wykorzystania tych aktualizowane zestawy (Microsoft.Owin.Security.Facebook i Microsoft.Owin.Security.Google) w projekcie MVC:

  • Microsoft.Owin
  • Microsoft.Owin.Security
  • Microsoft.Owin.Security.Cookies
  • Microsoft.Owin.Security.OAuth
  • Microsoft.Owin.Host.SystemWeb

Dokonano tego poprzez zastąpienie istniejących odniesień projektu do wersji 3.0.0 i aktualizowanie tych w pliku web.config. Dobra wiadomość: projekt pomyślnie się kompiluje.

diagnostykę, że otrzymał na starcie wyjątek:

wyjątek typu „System.IO.FileLoadException” w module [MVC wstęgowego zespołu] dll, ale nie traktowane kodu użytkownika

Informacje dodatkowe: Nie można załadować pliku lub zespołu "Microsoft.Owin.Security, wersja = 3.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35 'lub jedna z jego zależności. Definicja manifestu zlokalizowanego złożenia nie pasuje do odwołania do zespołu. (Wyjątek od HRESULT: 0x80131040)

Podstawowym wyjątek wskazuje, że Microsoft.AspNet.Identity.Owin próbował załadować V2.1.0 z Microsoft.Owin.Security Dzwoniąc app.UseExternalSignInCookie() z Startup.ConfigureAuth(IAppBuilder app) w uruchamianiu. Auth.cs.

Niestety że montaż (i jego zależność od innych, Microsoft.AspNet.Identity.Owin) nie są częścią rozwiązania Projekt Katana, i nie mogę znaleźć żadnego dostępnego repozytorium dla tych zespołów w Internecie.

Are Microsoft.AspNet.Identity zespoły open source, jak projekt Katana? Czy istnieje sposób na oszukanie tych złożeń, aby użyć zwoływanych złożeń v3.0.0 zamiast v2.1.0? Folder /bin zawiera wersje 3.0.0 zespołów Owin.

mam uaktualnione pakiety Nuget dla Microsoft.AspNet.Identity.Owin, a to jest nadal problemem.

Wszelkie pomysły na rozwiązanie tego problemu?

+0

Brzmi jak może zajść potrzeba zgromadzenia wiążącego przekierowanie. Przyjrzyj się temu jako przewodnikowi: http://rionscode.wordpress.com/tag/could-not-load-file-or-assembly-microsoft-owin/ –

+0

Dziękuję, przeczytałem to i zdałem sobie sprawę, że powiązanie to przekierowuje mówi o zmianach wprowadzonych w web.config: '" Sprawdziłem i zweryfikowaliśmy, że odwołania do złożeń są rzeczywiście w wersji 3.0.0.0, ale problem nadal występuje. –

+0

@d_mcg - czy określono nazwy zestawów w powiązanym przekierowaniu? Potrzebne będzie wiążące przekierowanie dla każdy pakiet, który chcesz przekierować do odpowiedniej wersji. Czy rzeczywiście zaktualizowałeś swoje referencje w projekcie lub po prostu zastąpiłeś pliki .dll w folderze bin? – Tommy

Odpowiedz

0

odkryłem, że podczas FacebookAuthenticationHandler jest oznaczony jako internal, jego streszczenie klasa bazowa AuthenticationHandler<TOptions> jest szczęście public. Ostatecznie wziąłem zmodyfikowaną wersję FacebookAuthenticationHandler ze źródła projektu Katana, zmieniłem jej nazwę i umieściłem w moim własnym rozwiązaniu, tak, że nadal używa bibliotek 2.1 i nie powoduje problemów z innymi zależnościami NuGet.

Podobnie dla GoogleOAuth2AuthenticationHandler.

Tak, wykorzystując przykład Facebook, mam następujące definicje klas w moim projekcie MVC:

// Overridden to add additional property 'ForceReauthentication' 
public class FacebookOAuth2ExtendedOptions : FacebookAuthenticationOptions 
... 

// Reimplemented v2.1 source with modified method 'ApplyResponseChallengeAsync' 
public class FacebookOAuth2CustomHandler : AuthenticationHandler<FacebookOAuth2ExtendedOptions> 
... 

// Reimplemented v2.1 source, modified to use 'FacebookOAuth2CustomHandler ' 
public class FacebookOAuth2CustomMiddleware : AuthenticationMiddleware<FacebookOAuth2ExtendedOptions> 
... 

Wreszcie w klasie Startup (App_Start/Startup.Auth.cs), zarejestrować uwierzytelnianie przy użyciu moich niestandardowych klas oprogramowania pośredniego:

public void ConfigureAuth(IAppBuilder app) 
{ 
    ... 

    var fbOptions = new FacebookOAuth2ExtendedOptions() 
    { 
     AppId = facebookAppKey, 
     AppSecret = facebookAppSecret, 
     ForceReauthentication = true 
    }; 
    app.Use(typeof(FacebookOAuth2CustomMiddleware), app, fbOptions); 

    ... 
} 

Mam nadzieję, że pomoże to innym osobom z podobnymi problemami.

8

I zaktualizowana OWin 3.0.1 i że problem został rozwiązany:

Narzędzia -> Nuget Package Manager -> Zarządzaj Nuget Pakiety do sporządzania roztworu

I szukał odniesień w liście (pod Nuget. org) i zainstalowano nowe referencje dla Microsoft.Owin oraz Microsoft.Owin.Security, Microsoft.Owin.Security.Google, Microsoft.Owin.Security.Facebook itp.

Następnie sprawdziłem numer wersji w moich pakietach. config i plik Web.Config i stwierdzono, że ta aktualizacja została poprawnie zaktualizowana:

Packages.config przykład: Przykład

<package id="Microsoft.Owin.Security.Google" version="3.0.1" TargetFramework="net45" /> 

Web.Config:

<assemblyIdentity name="Microsoft.Owin.Security" culture="neutral" publicKeyToken="31bf3856ad364e35" /> 
    <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />