2016-09-06 30 views
8

'da kimliği doğrulanmış kullanıcılara yeniden giriş yapma ASP.NET Çekirdeğindeki kimlik doğrulama boru hattı ile bazı sorunlara rastlıyorum. Sunucum, OpenID Connect ve Azure AD kullanarak zaten kimliği doğrulanmış bir kullanıcı için bir sorun oluşturmak istiyorum. Bunu yapmak istediğiniz birden çok senaryo vardır, örneğin AAD v2 uç noktası senaryosunda ek kapsamlar istendiğinde.ASP.NET Çekirdeği

Bu ASP.NET MVC'de bir çekicilik gibi çalışır, ancak ASP.NET Çekirdek MVC'de kullanıcı tanımlama bilgisi kimlik doğrulaması ara katmanında yapılandırıldığı şekilde Erişim Reddedildi sayfasına yönlendirilir. (Kullanıcı oturumu açmadığında, bir sorun çıkarması beklendiği gibi çalışır.)

Web'de birkaç saat çalıştıktan sonra ve ara katman yazılım seçeneklerim için farklı parametreler denemekten sonra, ya eksik olduğumdan şüphelenmeye başladım açık bir şey, ya da bu davranış tasarım gereğidir ve ihtiyacım başka bir şekilde çözmem gerekiyor. Bu konuda herhangi bir fikri olan var mı?

DÜZENLEME:

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); 
    } 

Ve Eylem şuna benzer:: my Startup.cs ilgili kısımları aşağıdaki gibi görünür

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

AuthenticationSchemes'ı kullanmayı düşündünüz mü? Bazı eylemler için kendi kimliğinizi doğrulamak istemiyorsanız, Yetkilendirme özniteliğini azureaadscheme gibi başka bir şema ile kullanabilirsiniz. –

+0

Ne yazık ki bu da işe yaramıyor. İstediğim şemaları ayarlayabilir ve zorluk için bir tane belirleyebilirim, ancak çerez kimlik doğrulaması hala bir şekilde ele alınıyor. Ve not, Authorize özniteliğini kullanmıyorum. Kullanıcı zaten doğrulanmış ve el ile bir meydan okuma yapıyorum. – VolatileCoder

+0

startup.cs ve eylem yöntemini gönderebilir misiniz? –

cevap

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

Bu da işe yaramıyor. İş, SignOut'u yayınlamak ve buna karşılık Mücadeleyi düzenleyen başka bir eyleme yönlendirmek için ne yapar. Ama açıkçası bu başka bir gidiş dönüş anlamına gelir ve bu nedenle yetersizdir. Oturum açıldıktan hemen sonra bir meydan okuma vermek, girişin oluşturduğu her türlü yanıtın üzerine yazılır. – VolatileCoder

+0

Sorununuzu çözdüğünden emin değilim, ancak uzak giriş ekledim, güncellenmiş yanıtı görün. –

+0

Maalesef, bu bir fark yaratmıyor.Aradaki bir yönlendirme olmadan, son ifade cevabın neye benzediğini belirtir, dolayısıyla bu, hiçbir şeyden önce hiçbir şeyden kaçınmaksızın bir meydan okuma yapmakla aynı şeydir. Ve kendi içinde (son ifade cevabı belirler) iyidir; Sadece Challenge, ASP.NET vPrev deneyimlerine dayanarak beklediğim gibi davranan bir yanıt oluşturmaz. – VolatileCoder

2

Bir ipucu ve çözüm buldu burada: https://github.com/aspnet/Security/issues/912. ChallengeBehavior.Unauthorized "anahtar" dır.

Bu mesaj akımı (november 2016 - ASPNet 1.0.1) verir geçici çözüm: https://joonasw.net/view/azure-ad-b2c-with-aspnet-core

Sen ChallengeBehavior.Unauthorized davranışı ile AuthauticationManager.ChallengeAsync arama yapabilmek için yeni bir ActionResult gerekir.

https://github.com/aspnet/Mvc/issues/5187 sorunu başarılı bir şekilde kapatıldıktan sonra, bu tümleşik olmalıdır.

Test ettim ve gayet iyi çalışıyordum (hedefim, Google kapsamlarını kullanıcı bazında genişletmek oldu).