2016-03-02 23 views
7

Tôi đang sử dụng Identity Server 3 cho máy chủ xác thực trung tâm cho ứng dụng web .Net MVC mà tôi đang xây dựng.Đăng xuất liên kết Azure AD không chuyển hướng đến ứng dụng khách

Tôi đã định cấu hình máy chủ xác thực để sử dụng nhà cung cấp nhận dạng Open ID Connect để cho phép người dùng xác thực dựa trên tài khoản Azure Active Directory nhiều người thuê, sử dụng luồng Hỗn hợp.

Hiện tại, đăng nhập hoạt động như mong đợi với ứng dụng khách của tôi chuyển hướng đến máy chủ xác thực để chuyển hướng tới Microsoft để đăng nhập trước khi quay lại ứng dụng khách của tôi bằng Mã truy cập được điền chính xác.

Tuy nhiên, khi tôi cố gắng đăng xuất, tôi được chuyển hướng đến Microsoft chính xác, nhưng trang dừng lại khi nó quay lại máy chủ xác thực thay vì tiếp tục quay lại ứng dụng khách của tôi.

Tôi tin rằng tôi đã thiết lập chuyển hướng đăng xuất chính xác như được nêu here và I nghĩ rằng tất cả các cài đặt của tôi đều ổn.

Khi tôi kéo Identity Server 3 mã xuống và gỡ lỗi nó, nó được thiết lập một cách chính xác các signOutMessageId vào chuỗi truy vấn, nhưng lượt truy cập các lỗi sau bên trong UseAutofacMiddleware phương pháp khi nó đang cố gắng để chuyển hướng đến ánh xạ signoutcallback vị trí của tôi:

ngoại lệ ném: 'System.InvalidOperationException' trong mscorlib.dll

thông tin bổ sung: Headers đã gửi

My Authentication Server thiết lập:

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 mở Id Connect thiết lập để kết nối với Azure AD:

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

tôi không thể tìm thấy bất kỳ thông tin về nguyên nhân hoặc giải pháp cho vấn đề này. Làm cách nào để định cấu hình điều này để chuyển hướng chính xác trở lại ứng dụng khách của tôi?

Edit:

thảo luận liên quan trên GitHub: https://github.com/IdentityServer/IdentityServer3/issues/2657

Tôi cũng đã thử điều này với phiên bản mới nhất của Identity Server trên MyGet (v2.4.1-build00452) với cùng một vấn đề.

Tôi cũng đã tạo ra một kho lưu trữ mà tái tạo vấn đề đối với tôi ở đây: https://github.com/Steve887/IdentityServer-Azure/

thiết lập AD Azure của tôi:

enter image description here

+0

Có một cuộc thảo luận tại - https://github.com/IdentityServer/IdentityServer3/issues/1000 về tính năng này. Tôi không chắc chắn nếu điều này giúp bạn. Bạn có gì trong nhật ký IdServ3 không? – Karthik

+0

@Karthik Tôi tin rằng cuộc thảo luận là điều đã dẫn đến việc thực hiện phương thức 'GetSignOutMessage' ngay từ đầu. Và không, không có gì trong nhật ký mà tôi có thể thấy. – Steve

Trả lời

0

Tôi tin rằng bạn đã trải qua một lỗi được cố định trong 2,5 (chưa được phát hành kể từ hôm nay): https://github.com/IdentityServer/IdentityServer3/issues/2678

+0

Như tôi đã đề cập trên [vấn đề GitHub] (https://github.com/IdentityServer/IdentityServer3/issues/2657#issuecomment-196572981) Tôi đã kéo bản dựng mới nhất từ ​​MyGet và nó không hoạt động. – Steve

+0

Ok, sau đó chúng ta cần gỡ lỗi thêm Steve. –

0

Sử dụng nguồn hiện tại từ Git, tôi vẫn thấy sự cố này. Nó xuất hiện với tôi rằng AuthenticationController.Logout được nhấn hai lần trong quá trình đăng xuất. Một lần trước khi trang đăng xuất của nhà cung cấp bên ngoài được hiển thị và một lần sau đó.Hàng đợi gọi ban đầu và xóa cookie đăng xuất để lần thứ hai không có sẵn khi hiển thị trang đăng xuất.

+0

Tôi đăng bài này lên vấn đề GitHub, nhưng tôi sẽ đặt nó ở đây để áp phích, phương thức 'AuthenticationController.Logout' của tôi chỉ nhận được một lần trước khi chuyển hướng đến nhà cung cấp ngược dòng, vì vậy đây không phải là nguyên nhân. – Steve

Các vấn đề liên quan