2016-09-06 15 views
8

Występują problemy z potokiem uwierzytelniania w środowisku ASP.NET Core. Mój scenariusz polega na tym, że chcę rzucić wyzwanie użytkownikowi, który jest już uwierzytelniony przy użyciu OpenID Connect i Azure AD. Istnieje wiele scenariuszy, w których chcesz to zrobić, na przykład podczas żądania dodatkowych zakresów w scenariuszu punktu końcowego AAD v2.Ponowne uwierzytelnianie uwierzytelnionych użytkowników w środowisku ASP.NET Core

Działa to jak urok w ASP.NET MVC, ale w ASP.NET Core MVC użytkownik jest przekierowywany do strony odmowy dostępu skonfigurowanej w oprogramowaniu pośredniczącym do uwierzytelniania plików cookie. (Gdy użytkownik nie jest zalogowany, wystawienie wyzwania działa zgodnie z oczekiwaniami.)

Po kilku godzinach przeszukiwania sieci i wypróbowaniu różnych parametrów dla opcji oprogramowania pośredniego, zaczynam podejrzewać, że albo mnie brakuje coś oczywistego lub takie zachowanie jest zgodne z projektem i muszę rozwiązać moje wymagania w inny sposób. Czy ktoś ma jakieś pomysły na ten temat?

EDIT: odpowiednie części moich Startup.cs wyglądać następująco:

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddMvc(); 

     services.AddAuthentication(
      SharedOptions => SharedOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme); 
    } 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     // <snip...> 

     app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme }); 

     var options = new OpenIdConnectOptions 
     { 
      AuthenticationScheme = OpenIdConnectDefaults.AuthenticationScheme, 
      ClientId = ClientId, 
      Authority = Authority, 
      CallbackPath = Configuration["Authentication:AzureAd:CallbackPath"], 
      ResponseType = OpenIdConnectResponseType.CodeIdToken, 
      PostLogoutRedirectUri = "https://localhost:44374/", 
      TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters 
      { 
       ValidateIssuer = false 
      } 
     }; 
     options.Scope.Add("email"); 
     options.Scope.Add("offline_access"); 

     app.UseOpenIdConnectAuthentication(options); 
    } 

a akcja wygląda następująco:

public void RefreshSession() 
    { 
     HttpContext.Authentication.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties { RedirectUri = "/" }); 
    } 
+0

Czy rozważałeś użycie AuthenticationSchemes? Jeśli chcesz zignorować autoryzację plików cookie dla niektórych działań, możesz użyć atrybutu Autoryzuj z innym schematem, np. Azureaadscheme. –

+0

Niestety to też nie pomaga. Mogę ustawić wszystkie schematy, jakie chcę, i określić jeden dla wyzwania, ale uwierzytelnianie plików cookie nadal jest w jakiś sposób zaangażowane w jego obsługę. I proszę zauważyć, że nie używam atrybutu Autoryzuj. Użytkownik jest już uwierzytelniony i ręcznie wystawiam wyzwanie. – VolatileCoder

+0

Czy mógłbyś opublikować startup.cs i metodę działania? –

Odpowiedz

0
Try to sign out: 

public void RefreshSession() 
{ 
     HttpContext.Authentication.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); 
     HttpContext.Authentication.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme); 
     HttpContext.Authentication.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties { RedirectUri = "/" }); 
} 
+0

To też nie działa. Praca polega na wydaniu SignOut i przekierowaniu do innej akcji, która z kolei wyzwala wyzwanie. Ale oczywiście oznacza to kolejny objazd i dlatego jest nieoptymalny. Wydanie wyzwania natychmiast po wyrejestrowaniu zastępuje odpowiedź, którą wygenerowałaby karta. – VolatileCoder

+0

Nie jestem pewien, czy rozwiązuje on twój problem, ale dodałem zdalne wylogowanie, zobacz zaktualizowaną odpowiedź. –

+0

Niestety, to nie ma znaczenia.Bez przekierowania, ostatnie oświadczenie określa, jak wygląda odpowiedź, więc jest to w istocie to samo, co wystawienie wyzwania bez żadnych elementów wylogowania. I to samo w sobie (ostatnie stwierdzenie określa odpowiedź) jest w porządku; jest tak, że Challenge nie generuje odpowiedzi, która zachowuje się tak, jak bym się spodziewał w oparciu o doświadczenia ASP.NET vPrev. – VolatileCoder

2

znalazłem wskazówkę i roztwór tutaj: https://github.com/aspnet/Security/issues/912. WyzwanieBehavior.Unauthorized jest "kluczem".

Ten post daje bieżący (listopad 2016 - aspnet 1.0.1) Obejście: https://joonasw.net/view/azure-ad-b2c-with-aspnet-core

Musisz nowy ActionResult aby móc wywołać AuthauticationManager.ChallengeAsync z ChallengeBehavior.Unauthorized zachowanie.

Po pomyślnym zamknięciu wydania https://github.com/aspnet/Mvc/issues/5187 należy to zintegrować.

Przetestowałem to i działało idealnie (moim celem było rozszerzenie zasięgu Google na jednego użytkownika).

Powiązane problemy