我有一个asp.net MVC / angular app(不是.net核心),使用OpenIdConnect对我们的IdentityServer4服务器进行身份验证。身份服务器上的登录页面有一个“记住我”复选框,用于设置Identity Server cookie过期。如果未设置该复选框,则将cookie过期设置为已过期,以便在浏览器关闭时刷新cookie。客户端MVC应用程序还构建客户端应用程序cookie。我希望cookie的过期与身份服务器cookie过期相匹配。我可以在身份服务器和客户端上将cookie过期值设置为相同,但这种情况仅在持久性状态匹配时才有效。
离。如果用户未选择在身份服务器登录时记住我,并且客户端应用程序正常使用过期,则在浏览器关闭时刷新身份服务器cookie,客户端应用程序cookie不会被删除。用户下次导航到该站点时,它会向用户查看他们是否已登录。一旦他们尝试访问由身份服务器保护的页面(我们使用ResourceAuthorization),他们就会被重定向到身份服务器登录页面。我宁愿删除客户端cookie,所以当用户返回它时,看起来他们仍然没有登录。
我正在通过SecurityTokenValidated事件查看OpenIdConnectAuthenticationNotifications。这是OpenIdConnect成功auth返回的位置。在这里,我们构建了客户端app authenticationTicket。创建此票证时,最好知道身份服务器的cookie是持久的还是cookie的到期时间。这里的protocolMessage似乎只包含有关令牌的信息。令牌过期与cookie过期不匹配。有没有办法让这些cookie同步?我错过了什么吗?
答案 0 :(得分:0)
旧帖。回答以便任何其他开发人员可以使用该方法。
我就是这样解决的
在身份登录完成后,我们可以设置一个 cookie 来保存持久性值。
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
this.SetPersistanceCookie(model.RememberMe);
return RedirectToLocal(returnUrl);
}
private void SetPersistanceCookie(bool rememberMe)
{
// setting persistant cookie, so that client app can set persistance of the application cookie in accordance with identity cookie
var persistanceCookieOptions = new CookieOptions
{
HttpOnly = true,
Secure = true,
};
HttpContext.Response.Cookies.Append("IsPersistant", rememberMe.ToString(), persistanceCookieOptions);
}
既然设置了此 cookie,您可以使用此 cookie 值在 OnTicketReceived 事件中设置应用程序 cookie 的持久性。
options.Events.OnTicketReceived = async context =>
{
// if for any reason we don't get IsPersistant Cookie (Which is used to set persistance of application cookie from identity cookie)
// we will set Application Cookie to non persistant (i.e. session life time)
bool rememberMe = context.Request.Cookies.ContainsKey("IsPersistant")
? context.Request.Cookies["IsPersistant"].Contains("True")
: false;
var authenticationProperties = new AuthenticationProperties()
{
IsPersistent = rememberMe,
ExpiresUtc = DateTime.UtcNow.AddDays(6),
IssuedUtc = DateTime.UtcNow
};
context.Properties = authenticationProperties;
await Task.FromResult(0);
};