从IdentityServer4 openIdConnect获取IsPersistent设置

时间:2018-04-19 18:15:47

标签: c# identityserver4 openid-connect

我有一个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同步?我错过了什么吗?

1 个答案:

答案 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);
};