我正在使用IdentityServer4和MVC客户端。当客户端会话到期时,我希望我的用户被迫再次登录。但无论我做什么,IdentityServer似乎会在会话结束时自动将用户重新登录。
我在客户端的启动是(会话是30秒测试)
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies", options => { options.ExpireTimeSpan = new TimeSpan(0, 0, 30); })
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.Authority = identityUrl;
options.RequireHttpsMetadata = false;
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.Scope.Add("Billing");
options.Scope.Add("offline_access");
options.UseTokenLifetime = false;
});
然后我在IdentityServer中的配置如下:
new Client
{
ClientId = "Test",
ClientName = "Test",
AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
AlwaysIncludeUserClaimsInIdToken = true,
RequireConsent = false,
IdentityTokenLifetime = 30,
AccessTokenLifetime = 30,
ClientSecrets =
{
new Secret("secret".Sha256())
},
RedirectUris = { billingUrl + "/signin-oidc" },
PostLogoutRedirectUris = { billingUrl + "/signout-callback-oidc" },
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
"Billing",
"role",
"VisionBlue.Cloud.BillingAPI"
},
AllowOfflineAccess = true
},
使用fiddler我可以在30秒后看到一个请求被发送到IdentityServer上的/ connect / authorize,它会自动再次登录用户。
有什么想法吗?我将所有超时设置为30秒作为测试。
答案 0 :(得分:9)
在您的授权请求中使用prompt=login
的OpenID Connect参数
(https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest)。这将告诉IdentityServer您希望用户重新进行身份验证,而不是使用SSO或IdentityServer会话长度。
您应该可以在OpenIdConnectOptions中使用ASP.NET Core执行此操作:
options.Events.OnRedirectToIdentityProvider = context =>
{
context.ProtocolMessage.Prompt = "login";
eturn Task.CompletedTask;
};
虽然可能有一种更简单的方法来设置它。
答案 1 :(得分:1)
接受的答案是正确的,但还有另一个选项,那就是 max_age 参数。使用它可以指定自 auth_time 以来的最长允许时间,如果超过此时间,它将自动提示用户再次进行身份验证。 您还可以在签名时检查 id_token 中的 auth_time 声明,以确保它在您想要的窗口中。我建议这样做,因为最终用户可以根据需要从授权请求中删除prompt = login或max_age = xxx。
答案 2 :(得分:-1)
如果我在这里阅读: http://docs.identityserver.io/en/release/topics/refresh_tokens.html
此行开启自动重新登录: AllowOfflineAccess = true
将其设置为false,这可以解决您的问题。
答案 3 :(得分:-1)
只会使客户端应用程序上的cookie失效。 IDS cookie也必须设置为过期。查看本地和外部登录的POST
方法。
您需要找到创建AuthenticationProperties
的部分(在快速入门中,它是设置AuthenticationToken
的位置),还要设置IsPersistent
和ExpiresUtc
之前属性将传递给HttpContext.SignInAsync
。
(顺便提一下,这也可用于支持会话之间的持久登录 - 在IDS4中设置较长的持续时间,然后向客户端添加非默认的OIDC配置文件,并在新的时候触发一次性的无提示登录尝试匿名会话开始。)