2016-04-22 6 views
11

C#ASP MVC WebアプリケーションでOpenId Connect認証(Microsoft.Owin.Security.OpenIdConnect)でOWIN/OAuthを使用しています。 SSOのMicrosoftアカウントへのログインは基本的には機能しますが、時々私はブラウザにエラーページBad Request - Request Too Longが表示されています。Cookieが多すぎるOpenIdConnect.nonceの原因でエラーページが表示される "Bad Request - Request too long"

このエラーは、あまりにも多くのCookieが原因であることがわかりました。クッキーを削除することはしばらくの間役立ちますが、しばらくしてから問題が戻ってきます。問題の原因となる

クッキーはOpenIDの枠組みから設定されているので、OpenIdConnect.nonce.9oEtF53WxOi2uAw.......ような名前のクッキーの数十がありますされています。

これは、SPAアプリケーションではありませんが、いくつかの部分は、Ajaxの呼び出しで定期的に更新されています。

答えて

25

根本原因がAjax呼び出しであることが判明しました。

問題の流れは

1)のOAuthクッキーは有効期限が通常login.microsoft.comにページがクッキーをリフレッシュするためにリダイレクトが発生するいくつかの時間

2)の後に有効期限が切れてしまいました。このステップでは、OAuthフレームワークは、毎回レスポンスに新しいnonceのクッキーを追加します。

3)しかし、アヤックスはlogin.microsoft.comにドメイン(クロスドメインの外側のリダイレクトを処理しません)。しかし、クッキーはすでにページに追加されていました。

4)次の定期的なAjax呼び出しは「一回だけの」クッキーの急激な増加の原因となる流れを繰り返しました。私はアヤックスを処理するための「OWINのOpenID」の枠組みのセットアップコードを延長しなければならなかった

ソリューション

が異なり呼び出す - リダイレクトを防ぎ、クッキーの送信を停止します。

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コードを検出し、(マイクロソフトの権威への迅速なリダイレクトを引き起こした)フル・ページ・リフレッシュを実行するために、あまりにも調整する必要がありました。私の場合は

+1

ありがとうございました。私も同様の問題を抱えていましたが、これが解決に役立ちました。 – Namrehs

+0

これはまた、クロムクッキーをクリアすると、私の問題を解決するようにも見えました。皮肉なことに、MSの勇敢な新しいブラウザEdgeは、IEと同じくらい多くの不一致とパフォーマンスの問題を抱えているので、今はchromeを使用しています。 –

+0

私の問題も解決しました。ありがとう! –

0

問題は、私はStartup.cs内のアプリケーションの構成された順序でした。

自己紹介 - 常に認証を最初に設定してください!

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... 
    } 
関連する問題