Asp.net

cookie 過多 OpenIdConnect.nonce 導致錯誤頁面“錯誤請求 - 請求太長”

  • April 22, 2016

Microsoft.Owin.Security.OpenIdConnect在 C# ASP MVC Web 應用程序中使用 OWIN / OAuth 和 OpenId Connect 身份驗證 ()。使用 Microsoft 帳戶的 SSO 登錄基本上可以工作,但有時我會在瀏覽器上收到一個錯誤頁面,上面寫著Bad Request - Request Too Long.

我發現這個錯誤是由太多的cookies引起的。刪除 cookie 會有所幫助,但一段時間後問題又回來了。

導致問題的 cookie 是從 OpenId 框架設置的,所以有幾十個 cookie 的名稱如OpenIdConnect.nonce.9oEtF53WxOi2uAw........

這不是 SPA 應用程序,但某些部分會通過 ajax 呼叫定期刷新。

原來,根本原因是 Ajax 呼叫。

有問題的流程是

  1. OAuth cookie 在一段時間後過期

  2. 過期通常會導致頁面重定向login.microsoft.com以刷新 cookie。在這一步中,OAuth 框架將新 nonce的 cookie 添加到響應中(每次)!

  3. 但是 Ajax 不處理域外的重定向(跨域到login.microsoft.com)。但是 cookie 已經附加到頁面上。

  4. 下一次定期 Ajax 呼叫重複了導致“nonce”cookie 快速增加的流程。

解決方案

我不得不擴展“OWIN OpenId”框架設置程式碼以不同方式處理 Ajax 呼叫 - 以防止重定向和停止發送 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);
               }
           }
       });
}

Ajax 呼叫程序也必須進行調整以檢測401程式碼並執行整頁刷新(這會導致快速重定向到 Microsoft 權限)。

引用自:https://stackoverflow.com/questions/36795259