2016-04-22 20 views
11

Tôi đang sử dụng OWIN/OAuth với xác thực OpenId Connect (Microsoft.Owin.Security.OpenIdConnect) trong ứng dụng web C# ASP MVC. Việc đăng nhập SSO với tài khoản Microsoft về cơ bản hoạt động, nhưng thỉnh thoảng tôi nhận được một trang lỗi trên trình duyệt có nội dung là Bad Request - Request Too Long.Quá nhiều cookie OpenIdConnect.nonce gây ra lỗi trang "Yêu cầu không hợp lệ - Yêu cầu quá dài"

Tôi phát hiện ra rằng lỗi này là do quá nhiều cookie. Việc xóa cookie sẽ giúp một thời gian, nhưng sau một thời gian, sự cố sẽ trở lại.

Cookie gây ra sự cố được đặt từ khung OpenId, do đó, có hàng tá cookie có tên như OpenIdConnect.nonce.9oEtF53WxOi2uAw........

Đây không phải là ứng dụng SPA, nhưng một số bộ phận được làm mới định kỳ với các cuộc gọi ajax.

Trả lời

25

Hóa ra nguyên nhân gốc là cuộc gọi Ajax.

Dòng vấn đề là

1) Cookie OAuth đã hết hạn sau một thời gian

2) Hết hạn thường gây ra chuyển hướng trang để login.microsoft.com để làm mới các tập tin cookie. Trong bước này, khuôn khổ OAuth thêmnonce cookie mới vào phản hồi (mọi thời điểm)!

3) Nhưng Ajax không xử lý các chuyển hướng bên ngoài miền (tên miền chéo đến login.microsoft.com). Nhưng cookie đã được thêm vào trang.

4) Cuộc gọi Ajax định kỳ tiếp theo lặp lại quy trình làm tăng nhanh các cookie 'nonce'.

Giải pháp

tôi đã phải kéo dài "OWIN OpenID" mã thiết lập khuôn khổ để xử lý các cuộc gọi Ajax cách khác nhau - để ngăn chặn chuyển hướng và dừng việc gửi các tập tin cookie.

public void ConfigureAuth(IAppBuilder app) 
{ 
    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 
    app.UseCookieAuthentication(new CookieAuthenticationOptions()); 

    app.UseOpenIdConnectAuthentication(
     new OpenIdConnectAuthenticationOptions 
     { 
      ClientId = clientId, 
      Authority = authority, 
      Notifications = new OpenIdConnectAuthenticationNotifications 
      { 
       RedirectToIdentityProvider = ctx => 
       { 
        bool isAjaxRequest = (ctx.Request.Headers != null && ctx.Request.Headers["X-Requested-With"] == "XMLHttpRequest"); 

        if (isAjaxRequest) 
        { 
         ctx.Response.Headers.Remove("Set-Cookie"); 
         ctx.State = NotificationResultState.HandledResponse; 
        } 

        return Task.FromResult(0); 
       } 
      } 
     }); 
} 

Trình gọi Ajax phải được điều chỉnh để phát hiện mã 401 và thực hiện làm mới toàn bộ trang (chuyển hướng nhanh đến cơ quan Microsoft).

+1

Cảm ơn bạn. Tôi đã có một vấn đề tương tự và điều này đã giúp giải quyết nó. – Namrehs

+0

Điều này cũng xuất hiện để giải quyết vấn đề của tôi sau khi tôi xóa cookie chrome. Trớ trêu thay vì trình duyệt mới của Microsoft ... có rất nhiều mâu thuẫn và các vấn đề về hiệu năng như IE, vì vậy tôi đã quay lại sử dụng Chrome ngay bây giờ. –

+0

Giải quyết được sự cố của tôi. Cảm ơn –

0

Trong trường hợp của tôi, sự cố là thứ tự mà tôi đã định cấu hình ứng dụng bên trong Startup.cs.

Lời nhắc tự - luôn định cấu hình xác thực trước!

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 
     app.UseCookieAuthentication(new CookieAuthenticationOptions()); 
     app.UseOpenIdConnectAuthentication(
      new OpenIdConnectAuthenticationOptions 
      { 
       ClientId = _clientId, 
       ClientSecret = _clientSecret, 
       Authority = _authority, 
       RedirectUri = _redirectUri 
      }); 

     // configure the rest of the application... 
    } 
Các vấn đề liên quan