4

我有一个 MVC 应用程序,其授权由身份服务器管理。当我第一次访问我的网站时,它会重定向到身份服务器登录页面,然后我再次重定向到我的网站。

我的问题是,如果我注销身份服务器,当我再次访问我的网站(使用身份服务器授权)时,我会被重定向到身份服务器,但登录会自动完成,从而允许我访问我的网站,而无需将用户/密码放入身份服务器。

我想这是因为 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

1

要从身份服务器注销,您需要重定向到结束会话端点。

通常/connect/endsession. 只有这样才能清除身份验证会话 cookie。

请参阅规范: https ://openid.net/specs/openid-connect-session-1_0.html#RPLogout

于 2016-11-09T09:53:23.103 回答
0

我有类似的要求。不是最优雅的方式,但我通过将 cookie 过期时间减少到 10 秒并关闭滑动过期来解决它。这里的边缘情况是如果依赖方在 10 秒内返回,则绕过登录提示。

于 2017-06-09T16:21:36.237 回答
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 回答
0

我为使用 MVC(非核心)的机密客户端应用程序而战。我最终解决了这个问题:在通知中ConfigureAuth(IAppBuilder app)添加对新任务的引用:RedirectToIdentityProvider = OnRedirectToIdentityProvider, 然后添加任务:

private Task OnRedirectToIdentityProvider(RedirectToIdentityProviderNotification
<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> notification) 
     {             
         // Forces the user to login. 
         if (notification.ProtocolMessage.Prompt == null) 
         { 
             notification.ProtocolMessage.Prompt = "login";                 
         } 
         return Task.FromResult(0); 
     }
于 2020-05-05T14:51:14.063 回答