2015-02-24 10 views
8

Mam trudny czas na debugowanie uaktualnienia pakietu OWIN w moim projekcie open source. Krótki opis jest taki, że przy użyciu zewnętrznych przerw logowań w nowej wersji v3, gdy uaktualniam z wersji 2.1, i podczas debugowania nie mogę określić, co jest inne. Należy pamiętać, że żaden z moich kodów nie został zmieniony, ja tylko aktualizuję komponenty OWIN (pakiety w Microsoft.Owin i inne podrzędne obszary nazw).Aktualizacja OWIN z wersji 2.1 na 3.0.1 łamie zewnętrzną autoryzację

Zaczyna z tą formą postu:

<form action="/Forums/Authorization/ExternalLogin?ReturnUrl=http%3A%2F%2Flocalhost%3A1973%2FForums" method="post"><input name="__RequestVerificationToken" type="hidden" value="--verificationtoken--" />  <h2>External Logins</h2> 
    <p> 
    <button type="submit" id="Google" name="provider" value="Google" class="btn btn-primary">Google</button> 
    </p> 
</form> 

To postów do tej metody: https://github.com/POPWorldMedia/POPForums/blob/v13.0.0/PopForums/Controllers/AuthorizationController.cs

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult ExternalLogin(string provider, string returnUrl) 
{ 
    return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Authorization", new { loginProvider = provider, ReturnUrl = returnUrl, area = "PopForums" })); 
} 

Ziemie oddzwonienia tutaj:

public async Task<ActionResult> ExternalLoginCallback(string loginProvider, string returnUrl) 
{ 
    var authentication = _owinContext.Authentication; 
    var authResult = await _externalAuthentication.GetAuthenticationResult(authentication); 
    if (authResult == null) 
     return RedirectToAction("Login", "Account", new { error = Resources.ExpiredLogin }); 
... 

To druga linia nazywa to : https://github.com/POPWorldMedia/POPForums/blob/v13.0.0/PopForums/ExternalLogin/ExternalAuthentication.cs

public async Task<ExternalAuthenticationResult> GetAuthenticationResult(IAuthenticationManager authenticationManager) 
{ 
    var authResult = await authenticationManager.AuthenticateAsync(ExternalCookieName); 
    if (authResult == null) 
     return null; 
... 

AuthenticationManager może być dowolny z implementacjami IAuthenticationManager w Google, Facebook, itp pakietach. Problem polega na tym, że wszystkie zawodzą i zwracają obiekt zerowy, więc aplikacja nie może zalogować się do użytkownika.

Aby odtworzyć:

Zastanawiam się, czy coś się zmieniło w konfiguracji OWIN, której nie rozumiem. Dla przypomnienia, to tutaj: https://github.com/POPWorldMedia/POPForums/blob/v13.0.0/PopForums/Configuration/PopForumsOwinStartup.cs

using System; 
using Microsoft.Owin.Security; 
using Microsoft.Owin.Security.Cookies; 
using Owin; 
using PopForums.ExternalLogin; 
using PopForums.Services; 
using PopForums.Web; 

namespace PopForums.Configuration 
{ 
    public class PopForumsOwinStartup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      var setupService = PopForumsActivation.ServiceLocator.GetInstance<ISetupService>(); 
      if (!setupService.IsDatabaseSetup()) 
       return; 

      var settings = PopForumsActivation.ServiceLocator.GetInstance<ISettingsManager>().Current; 

      app.SetDefaultSignInAsAuthenticationType(ExternalAuthentication.ExternalCookieName); 

      app.UseCookieAuthentication(new CookieAuthenticationOptions 
      { 
       AuthenticationType = ExternalAuthentication.ExternalCookieName, 
       AuthenticationMode = AuthenticationMode.Passive, 
       CookieName = CookieAuthenticationDefaults.CookiePrefix + ExternalAuthentication.ExternalCookieName, 
       ExpireTimeSpan = TimeSpan.FromMinutes(60) 
      }); 

      if (settings.UseTwitterLogin) 
       app.UseTwitterAuthentication(
        consumerKey: settings.TwitterConsumerKey, 
        consumerSecret: settings.TwitterConsumerSecret); 

      if (settings.UseMicrosoftLogin) 
       app.UseMicrosoftAccountAuthentication(
        clientId: settings.MicrosoftClientID, 
        clientSecret: settings.MicrosoftClientSecret); 

      if (settings.UseFacebookLogin) 
       app.UseFacebookAuthentication(
        appId: settings.FacebookAppID, 
        appSecret: settings.FacebookAppSecret); 

      if (settings.UseGoogleLogin) 
       app.UseGoogleAuthentication(settings.GoogleClientId, settings.GoogleClientSecret); 
     } 
    } 
} 

Wszelkie pomysły?

+0

Zarządzaj, aby znaleźć rozwiązanie tego problemu? Doświadczam tego samego, kiedy używam wersji 3.0.1 –

+0

Bez radości. Nie miałem czasu spojrzeć na źródło i porównać. –

Odpowiedz

2

Nie jestem pewien, czy to pomoże, ale jeśli spojrzysz na szablony, użyj AuthenticationManager.ExternalLinkLoginInfoAsync(), aby pobrać wynik wywołań zwrotnych OAuth. Czy możesz sprawdzić i zobaczyć, czy Twój kod startowy nieznacznie różni się od domyślnych szablonów.

Używasz:

app.SetDefaultSignInAsAuthenticationType(ExternalAuthentication.ExternalCookieName); 

gdzie szablony domyślne użyć:

app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

można szybko porównać co szablony zastosować w tym podsumowaniu jednego z moich blogach:

http://weblog.west-wind.com/posts/2015/Apr/29/Adding-minimal-OWIN-Identity-Authentication-to-an-Existing-ASPNET-MVC-Application#MinimalCodeSummary

Bardzo frustrujące jest to, że ten brat ke dla ciebie - te rzeczy powinny być kompatybilne wstecz - nie jest w porządku łamanie istniejącego kodu przy użyciu takiego podstawowego komponentu systemu.

+0

Nawiasem mówiąc, Microsoft dokonał zmiany OAuth zerwania między Owin 3.0.0 i 3.0.1. 3.0.0 był prawdopodobnie zgodny z 2.x, ale potem "naprawił błąd" w formacie biletu ... Zobacz http://stackoverflow.com/questions/30074563/old-tokens-stopped-working-after -aktualność-owin-z-3-0-0-do-3-0-1 – vkelman

Powiązane problemy