私はすでに問題があると関連するリンクhere、hereおよび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ページ。
- 私は私をリダイレクトする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 ページ。
- 資格情報を入力してログインします。
- ログイン後、私は をウェブサイトにリダイレクトしてログアウトします。
が正常にログに記録されます。フィドラーは、予想通り、私は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
を示しています。
- ブラウザを閉じる(この手順は重要です)
- もう一度WebサイトURLを入力して、IDサーバーのログインページにリダイレクトします。 (ステップ1と同様)
- 資格情報を入力してログインします。
- ログインに成功すると、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.OpenIdConnect
を3.0.0
にダウングレードしました。
しかし、私はまだ連続ループで立ち往生しています。唯一の違いは、各往復に新しいOpenIdConnect.nonce.OpenIdConnect
クッキーが追加されていないことです。フィドラーは、各往復に1つのクッキーしか表示しません。しかしHttpContext.Current.Request.IsAuthenticated
はまだ偽です。だから私は連続ループで立ち往生してしまう。
です。 https://stackoverflow.com/questions/29780627/identityserver-gets-into-infinite-loop-of-authentication –
これを解決しましたか? – bkwdesign
@bkwdesignはい、私はhttps://github.com/KentorIT/owin-cookie-saverミドルウェアを追加して解決しました。 – LP13