2016-03-02 27 views
7

Identity Server 3 numaralı merkezi kimlik doğrulama sunucusu için oluşturduğum .Net MVC web uygulamasında kullanıyorum.Azure AD fedeli oturum kapatma istemci uygulamasına yönlendirmiyor

Kullanıcıların Hybrid akışını kullanarak çok kiracılı bir Azure Active Directory hesabına kimlik doğrulaması yapabilmelerini sağlamak için kimlik doğrulama sunucusunu Open ID Connect kimlik sağlayıcısını kullanacak şekilde yapılandırdım.

Şu anda, istemci uygulamamda doğru şekilde doldurulmuş bir Access Token ile istemci uygulamanıza geri dönmeden önce oturum açmak için Microsoft'a yönlendiren kimlik doğrulama sunucusuna yeniden yönlendiren istemci uygulamasında beklendiği gibi oturum açma çalışmaları.

Ancak, çıkış yapmayı denediğimde Microsoft'a doğru şekilde yeniden yönlendirilirim, ancak istemci uygulamasına geri dönmek yerine kimlik doğrulama sunucusuna geri döndüğünde sayfa durur.

Postout yönlendirme yönergelerini doğru olarak belirtildiği gibi here ve düşünün tüm ayarlarımın tamam olduğunu düşünüyorum.

Ben Kimlik Sunucusu 3 aşağı kodu ve, doğru sorgu dizesi üzerine signOutMessageId kuruyor hata ayıklama çekin, ama benim eşlenen signoutcallback yere yönlendirmek için çalışıyor UseAutofacMiddleware yöntemi içinde aşağıdaki hatayı çarptığında:

mscorlib.dll 'System.InvalidOperationException'

Ek bilgiler:

özel durum Başlıkları zaten

gönderilenMy Kimlik Doğrulama Sunucusu kurulumu:

app.Map("identity", idsrvApp => { 
    var idSvrFactory = new IdentityServerServiceFactory(); 

    var options = new IdentityServerOptions 
    {     
     SiteName = "Site Name", 
     SigningCertificate = <Certificate>, 
     Factory = idSvrFactory, 
     AuthenticationOptions = new AuthenticationOptions 
     { 
      IdentityProviders = ConfigureIdentityProviders, 
      EnablePostSignOutAutoRedirect = true, 
      PostSignOutAutoRedirectDelay = 3 
     } 
    }; 
    idsrvApp.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 
    idsrvApp.UseIdentityServer(options); 

    idsrvApp.Map("/signoutcallback", cb => { 
        cb.Run(async ctx => { 
           var state = ctx.Request.Cookies["state"]; 
           ctx.Response.Cookies.Append("state", ".", new Microsoft.Owin.CookieOptions { Expires = DateTime.UtcNow.AddYears(-1) }); 
           await ctx.Environment.RenderLoggedOutViewAsync(state); 
        }); 
       }); 
}); 

My Açık Kimliği Connect kurulum Azure AD bağlanmak için:

app.UseOpenIdConnectAuthentication(
    new OpenIdConnectAuthenticationOptions 
    { 
     AuthenticationType = "aad", 
     SignInAsAuthenticationType = signInAsType, 

     Authority = "https://login.microsoftonline.com/common/", 
     ClientId = <Client ID>, 
     AuthenticationMode = AuthenticationMode.Active, 
     TokenValidationParameters = new TokenValidationParameters 
     { 
      AuthenticationType = Constants.ExternalAuthenticationType, 
      ValidateIssuer = false, 
     }, 
     Notifications = new OpenIdConnectAuthenticationNotifications() 
     { 
      AuthorizationCodeReceived = (context) => 
      { 
       var code = context.Code; 
       ClientCredential credential = new ClientCredential(<Client ID>, <Client Secret>); 
       string tenantId = context.AuthenticationTicket.Identity.FindFirst("tid").Value; 
       AuthenticationContext authContext = new AuthenticationContext($"https://login.microsoftonline.com/{tenantId}"); 
       AuthenticationResult result = authContext.AcquireTokenByAuthorizationCode(
          code, new Uri(<Identity Server URI>/aad/"), credential, "https://graph.windows.net"); 

       return Task.FromResult(0); 
      }, 
      RedirectToIdentityProvider = (context) => 
      { 
       string appBaseUrl = context.Request.Scheme + "://" + context.Request.Host + context.Request.PathBase; 
       context.ProtocolMessage.RedirectUri = appBaseUrl + "/aad/"; 
       context.ProtocolMessage.PostLogoutRedirectUri = appBaseUrl + "/signoutcallback"; 

       if (context.ProtocolMessage.RequestType == Microsoft.IdentityModel.Protocols.OpenIdConnectRequestType.LogoutRequest) 
       { 
        var signOutMessageId = context.OwinContext.Environment.GetSignOutMessageId(); 
        if (signOutMessageId != null) 
        { 
         context.OwinContext.Response.Cookies.Append("state", signOutMessageId); 
        } 
       } 
       return Task.FromResult(0); 
      } 
    }); 

Ben bu soruna nedenine veya çözümü hakkında herhangi bir bilgi bulamıyorum. İstemcim uygulamasına doğru bir şekilde yeniden yönlendirmek için bunu nasıl yapılandırabilirim?

Düzenleme: GitHub üzerinde

İlgili tartışma: https://github.com/IdentityServer/IdentityServer3/issues/2657

Ben de aynı sorunla MyGet (v2.4.1-build00452) Kimlik Server son sürümü ile bu çalıştılar.

Ben de burada benim için sorun yeniden üreten bir depo oluşturduk: https://github.com/Steve887/IdentityServer-Azure/

Benim Azure AD kurulumu:

enter image description here

+0

Bu özellik hakkında - https://github.com/IdentityServer/IdentityServer3/issues/1000 adresinde bir tartışma yapıldı. Bunun size yardımcı olup olmadığından emin değilim. IdServ3 günlüklerinde bir şey var mı? – Karthik

+0

@Karthik Tartışmanın ilk sırada 'GetSignOutMessage' yönteminin uygulanmasına yol açtığına inanıyorum. Ve hayır, görebileceğim günlüklerde hiçbir şey yok. – Steve

cevap

0

Sana 2.5 giderilen bir hata (karşılaştığınız inanıyoruz Şu andan itibaren piyasaya sürülmedi: https://github.com/IdentityServer/IdentityServer3/issues/2678

+0

[GitHub sorunu] 'nda belirttiğim gibi (https://github.com/IdentityServer/IdentityServer3/issues/2657#issuecomment-196572981) En son yapıyı MyGet'ten çektim ve işe yaramadı. – Steve

+0

Tamam, o zaman daha fazla Steve'in hatalarını ayıklamamız gerek. –

0

Geçerli kaynağı Git'ten kullanma, hala bu sorunu görüyorum. AuthenticationController.Logout'un çıkış sırasında iki kez vurulduğu görünmüyor. Harici sağlayıcının çıkış sayfasından önce bir kez ve sonra bir kez görüntülenir.İlk çağrı Oturum kapatma çerezini siler ve temizler, böylece çıkış sayfası oluşturulurken ikinci kez kullanılamaz.

+0

Bunu GitHub sorununda yayınladım, ama buraya posterity için koyacağım, 'AuthenticationController.Logout' yönteminin yalnızca bir kez yukarı akış sağlayıcısına yönlendirme yapması gerekiyor, bu yüzden bu bir neden değil. – Steve