C# 从IdentityServer4 openIdConnect获取IsPersistent设置

C# 从IdentityServer4 openIdConnect获取IsPersistent设置,c#,identityserver4,openid-connect,C#,Identityserver4,Openid Connect,我有一个asp.net MVC/angular应用程序(不是.net core),它使用OpenIdConnect对我们的IdentityServer4服务器进行身份验证。identity server上的登录页面有一个“记住我”复选框,用于设置identity server cookie过期时间。如果未设置该复选框,则cookie expiration将设置为expired,以便在浏览器关闭时刷新cookie。客户端MVC应用程序还构建客户端应用程序cookie。我希望该cookie的过期时间

我有一个asp.net MVC/angular应用程序(不是.net core),它使用OpenIdConnect对我们的IdentityServer4服务器进行身份验证。identity server上的登录页面有一个“记住我”复选框,用于设置identity server cookie过期时间。如果未设置该复选框,则cookie expiration将设置为expired,以便在浏览器关闭时刷新cookie。客户端MVC应用程序还构建客户端应用程序cookie。我希望该cookie的过期时间与identity server cookie的过期时间相匹配。我可以在identity server和客户端上将cookie过期值设置为相同,但这种情况仅在peristence状态匹配时有效

例如,如果用户在identity server登录时没有选择“记住我”,并且客户端应用程序像通常一样使用过期时间,则当浏览器关闭时,会刷新identity server cookie,而客户端应用程序cookie不会被删除。下一次用户导航到该站点时,在用户看来好像他们已登录。一旦他们尝试访问由identity server保护的页面(我们使用ResourceAuthorization),他们就会被重定向到identity server登录页面。我宁愿删除客户端cookie,这样当用户返回时,看起来就不会让他们仍然登录


我在SecurityTokenValidated事件中查看OpenIdConnectAuthenticationNotifications。这就是OpenIdConnect成功身份验证返回的位置。在这里,我们构建客户端应用程序authenticationTicket。创建此票证时,最好至少知道identity server的cookie是持久的还是该cookie的过期时间是多少。这里的protocolMessage似乎只包含有关令牌的信息。令牌过期与cookie过期不匹配。有没有办法让这些cookies同步?我遗漏了什么吗?

旧帖子。回答,以便任何其他开发人员可以使用该方法

我就是这样解决的

在identity中完成登录后,我们可以设置一个保存持久性值的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);
};

我也在寻找类似的东西,我必须通知像cookie这样的后台客户端是持久性还是非持久性,或者我必须包括表明持久性的声明。但我如何在IProfileService中发布声明时访问IsPersistent/Memberme