4

私はidentityserverによって管理された承認を持つMVCアプリを持っています。Web に初めてアクセスすると、identityserver のログイン ページにリダイレクトされ、Web に再度リダイレクトされた後にリダイレクトされます。

私の問題は、identityserver からログアウトした場合、(identityserver の承認を使用して) Web に再度アクセスすると、identityserver にリダイレクトされますが、ログインは自動的に行われ、idserver にユーザー/パスを入力せずに Web にアクセスできるようになります。

クライアントでCookieがまだ生きているためだと思います(ブラウザですべてのCookieを手動で削除すると、ユーザー/パスが必要になります)。

自動ログインを無効にするにはどうすればよいですか (ユーザー/パスが常に必要になるように強制します)?

私のスタートアップクライアントの構成は次のようなものです:

 app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            LoginPath = new PathString("/Home/Logged/"),
            AuthenticationType = "Cookies",
            ExpireTimeSpan = TimeSpan.FromDays(2),
            SlidingExpiration = true,
            CookieName = ".AspNet.MyApp"

        });


        app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
        {
            ClientId = "MyApp",
            Authority = IS_URL,
            RedirectUri = localHostURL + "/Home/Logged/",
            PostLogoutRedirectUri = localHostURL + "/Account/Login/",
            ResponseType = "code id_token token", 
            Scope = "openid profile read write sampleApi",
            SignInAsAuthenticationType = "Cookies",

            UseTokenLifetime = true,

            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                SecurityTokenValidated = async n =>
                {
                    var nid = new ClaimsIdentity(
                        n.AuthenticationTicket.Identity.AuthenticationType,
                        "given_name",
                        "role");

                    // get userinfo data
                    var userInfoClient = new UserInfoClient(
                        new System.Uri(n.Options.Authority + "/connect/userinfo"),
                        n.ProtocolMessage.AccessToken);

                    var userInfo = await userInfoClient.GetAsync();
                    userInfo.Claims.ToList().ForEach(ui => nid.AddClaim(new Claim(ui.Item1, ui.Item2)));

                    //keep the id_token for logout

                   nid.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));

                   // add access token for sample API
                   nid.AddClaim(new Claim("access_token", n.ProtocolMessage.AccessToken));

                    // keep track of access token expiration
                    nid.AddClaim(new Claim("expires_at", TimeSpan.FromDays(2).ToString()));

                    // add some other app specific claim
                    nid.AddClaim(new Claim("app_specific", "some data"));

                    n.AuthenticationTicket = new AuthenticationTicket(
                        nid,
                        n.AuthenticationTicket.Properties);
                },
                RedirectToIdentityProvider = n =>
                {
                    if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest)
                    {
                        var idTokenHint = n.OwinContext.Authentication.User.FindFirst("id_token");

                        if (idTokenHint != null)
                        {
                            n.ProtocolMessage.IdTokenHint = idTokenHint.Value;
                        }
                    }

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

前もって感謝します!

4

4 に答える 4

0

idsrv へのログイン要求/リダイレクトで、promptパラメーターをに設定しますlogin

OnRedirectToIdentityProvider = n =>
{

    if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.Authentication)
    {    
        n.ProtocolMessage.Prompt = "login";
    }

    return Task.FromResult(0);
}

IdSrv ドキュメント(プロンプトを参照)

prompt (optional)

loginユーザーがすでにサインインしており、有効なセッションがある場合でも、ログイン UI が表示されます。

/authorizeリクエストに関する OpenId Connect 仕様

prompt=login

認可サーバーは、エンドユーザーに再認証を促す必要があります。エンドユーザーを再認証できない場合は、エラー (通常は login_required) を返す必要があります。

于 2016-11-08T22:35:30.847 に答える