2017-03-11 7 views
3

私はすでに問題があると関連するリンクherehereおよびhereを既に経由しています。OpenID.nonceのクッキーが多すぎると、「Bad Request」が発生する

認証にIdentiServer3を使用しているSilverlightアプリケーションがあります。ログアウト機能を実装したばかりの時点で、この問題が発生しました。ログインとログアウトの機能は、従来のASP.Net Webフォームであるサーバー側で実際に実装されているため、この問題はSilverlightとは関係ありません。 (.NET 4.5.1)

アプリケーションにはログアウト機能がありませんでしたので、ユーザーは以前ブラウザを閉じてしまったので、以前にこの問題に遭遇したことはありませんでした。私たちは今logout.aspxページを持っており、Silverlightアプリケーションにはこのページへのリンクがあります。

Logout.aspxページ

public partial class Logout : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Request.IsAuthenticated) 
     { 
      Session.Clear(); 
      Request.GetOwinContext().Authentication.SignOut(); 
     } 
     Response.Redirect("/"); 
    } 
} 

Default.aspxページ。

  1. 私は私をリダイレクトするWebサイトのURLを入力します。これは、OpenIDの接続は問題を再現する

    app.UseCookieAuthentication(new CookieAuthenticationOptions 
         { 
          AuthenticationType = "Cookies", 
          LoginPath = new Microsoft.Owin.PathString("/Default.aspx") 
         }); 
    
        app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions 
         { 
          Authority = ConfigurationManager.AppSettings["Authority"], 
          Scope = "openid profile", 
          ClientId = ConfigurationManager.AppSettings["ClientId"], 
          RedirectUri = ConfigurationManager.AppSettings["RedirectUri"], 
          ResponseType = "id_token", 
          SignInAsAuthenticationType = "Cookies", 
    
          Notifications = new OpenIdConnectAuthenticationNotifications 
          { 
           SecurityTokenValidated = (context) => 
           { 
    
            var id = context.AuthenticationTicket.Identity; 
    
            // create new identity 
            var newIdentity = new ClaimsIdentity(id.AuthenticationType); 
    
            // we want to keep username and subjectid       
            var sub = id.FindFirst(ClaimTypes.NameIdentifier); 
            var username = id.FindFirst("preferred_username"); 
            newIdentity.AddClaim(username); 
            newIdentity.AddClaim(sub); 
    
            // keep the id_token for logout 
            newIdentity.AddClaim(new Claim("id_token", context.ProtocolMessage.IdToken)); 
    
            context.AuthenticationTicket = new AuthenticationTicket(
             newIdentity, 
             context.AuthenticationTicket.Properties); 
    
            return Task.FromResult(0); 
           }, 
    
           RedirectToIdentityProvider = (context) => 
           { 
            if (context.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest) 
            { 
             var idTokenHint = context.OwinContext.Authentication.User.FindFirst("id_token").Value; 
             context.ProtocolMessage.IdTokenHint = idTokenHint; 
            } 
            return Task.FromResult(0); 
           },      
          } 
    

    ステップを設定されているページ

    public partial class Default : Page 
    { 
        protected void Page_Load(object sender, EventArgs e) 
        { 
         // Send an OpenID Connect sign-in request. 
         if (!System.Web.HttpContext.Current.Request.IsAuthenticated) 
         { 
          HttpContext.Current.GetOwinContext().Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/" }, OpenIdConnectAuthenticationDefaults.AuthenticationType); 
         } 
        } 
    } 
    

    OWIN起動クラスを始めていますidentityserver3 login ページ。

  2. 資格情報を入力してログインします。
  3. ログイン後、私は をウェブサイトにリダイレクトしてログアウトします。
  4. が正常にログに記録されます。フィドラーは、予想通り、私はhttps://idsvr.mydomain.com/identity/logout?id=xxxxxxxページ上に着陸し、次のコール

    https://idsvr.mydomain.com/identity/connect/endsession?id_token_hint=XXXXXXXXXXXXXX https://idsvr.mydomain.com/identity/logout?id=616dd9a4e4c6a55b0bb27faceb4df8dd https://idsvr.mydomain.com/identity/connect/endsessioncallback?sid=xxxxxx

  5. を示しています。

  6. ブラウザを閉じる(この手順は重要です)
  7. もう一度WebサイトURLを入力して、IDサーバーのログインページにリダイレクトします。 (ステップ1と同様)
  8. 資格情報を入力してログインします。
  9. ログインに成功すると、IdentityServerはWebサイトにPOSTを行い、WebサイトはAuthenticationTicketを作成します。ただし、ここではHttpContext.Current.Request.IsAuthenticatedが偽であるため、Default.aspxページがIdentityServerにリダイレクトされます。私は既にログインしているため、IndetityserverはクライアントのWebサイトにリダイレクトされ、ループは続行されます。

Fiddlerは、identityServerからWebサイトのdefault.aspxページへのいくつかの往復を示しています。各往復はOpenIdConnect.nonce.OpenIdConnectのクッキーを追加し続け、最終的に最大要求サイズのために不正なリクエストエラーが発生します。

上記のリンクで提案されているように、私はクライアントアプリケーションでMicrosoft.Owin.Security.OpenIdConnect3.0.0にダウングレードしました。

しかし、私はまだ連続ループで立ち往生しています。唯一の違いは、各往復に新しいOpenIdConnect.nonce.OpenIdConnectクッキーが追加されていないことです。フィドラーは、各往復に1つのクッキーしか表示しません。しかしHttpContext.Current.Request.IsAuthenticatedはまだ偽です。だから私は連続ループで立ち往生してしまう。

+0

です。 https://stackoverflow.com/questions/29780627/identityserver-gets-into-infinite-loop-of-authentication –

+0

これを解決しましたか? – bkwdesign

+1

@bkwdesignはい、私はhttps://github.com/KentorIT/owin-cookie-saverミドルウェアを追加して解決しました。 – LP13

答えて

3

私のasp.net mvcアプリケーションで同様の問題が発生しました。いくつかの研究の後、私はMicrosoftのOwinのSystem.Webの実装にバグがあることを発見しました。 IIS上でOwinアプリケーションを実行するときに使用されているもの。 ASP.NET MVC5で新しいOwinベースの認証処理を使用している場合は、おそらく99%のユーザーがこれを実行します。

Owinによって設定されたクッキーが不思議にいくつか消えてしまいます。

このミドルウェアは、このバグに対する修正です。 Cookieを処理するミドルウェアの前にSimpleを追加すると、認証Cookieが保持されます。ここで

app.UseKentorOwinCookieSaver(); 

クライアントがHTTPを使用しますが、サーバーがHTTPS(またはその逆)ときに、リンクは、時には無限ループが発生して詳細に https://github.com/KentorIT/owin-cookie-saver

+1

Owinミドルウェアがユーザーを認証していたが、認証Cookieが失われている状況をデバッグしようと数日を費やしました。私は上記のNuGetパッケージをインストールして、今すぐ動作します!ありがとう。 – MarkHone

+0

@Narendraは、私はパッケージをnugetインストールしようとした 'Kentor.OwinCookieSaver'しかし、私はエラー'重大度に\tコード\t説明\tプロジェクト\tファイル\tライン\t抑制状態\t \tは「Kentor.OwinCookieSaver 1.1.1」パッケージをインストールできませんでした エラーを取得しています。このパッケージを '.NETFramework、Version = v4.5.1'を対象とするプロジェクトにインストールしようとしていますが、そのフレームワークと互換性のあるアセンブリ参照またはコンテンツファイルがパッケージに含まれていません。詳細については、パッケージ作成者にお問い合わせください。 \t \t – LP13

+0

私はそれを解決しました – LP13

関連する問題