Asp.net core 在JWT(Identity Server 4)中添加RememberMe值作为声明

Asp.net core 在JWT(Identity Server 4)中添加RememberMe值作为声明,asp.net-core,identityserver4,Asp.net Core,Identityserver4,我正在使用IdentityServer 4 发出索赔时是否可以访问RememberMe布尔值?(在Microsoft.AspNetCore.Identity中命名为isPersistent) 我的想法是添加一个反映RememberMe值的声明,以便其他应用程序可以使用该值 目前,我正在接口IProfileService.GetProfileDataAsync的实现中添加声明 public async Task GetProfileDataAsync(ProfileDataRequestConte

我正在使用IdentityServer 4

发出索赔时是否可以访问
RememberMe
布尔值?(在Microsoft.AspNetCore.Identity中命名为
isPersistent

我的想法是添加一个反映
RememberMe
值的声明,以便其他应用程序可以使用该值

目前,我正在接口
IProfileService.GetProfileDataAsync
的实现中添加声明

public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
    await Task.Run(() =>
    {
        try
        {
            var user = _userManager.GetUserAsync(context.Subject).Result;
            var claims = new List<Claim>
            {
                // I'm adding my current claims here, like so:
                new Claim("contact_id", user.ContactId.ToString()),
                // etc

                // I would like to add RememberMe
                new Claim("remember_me", ??? )
            };
            context.IssuedClaims.AddRange(claims);
 // ..            

公共异步任务GetProfileDataAsync(ProfileDataRequestContext上下文) { 等待任务。运行(()=> { 尝试 { var user=\u userManager.GetUserAsync(context.Subject).Result; var索赔=新列表 { //我在这里添加我当前的声明,如下所示: 新声明(“contact_id”,user.ContactId.ToString()), //等 //我想补充一点 新的索赔(“记住我”?) }; context.IssuedClaims.AddRange(索赔); // ..
或者可以通过其他方法访问
RememberMe
值吗?

是的,您应该向令牌添加声明。在标准OIDC规范中,令牌是
客户端和身份提供程序之间的绑定。只要IdentityServer需要向客户端应用程序返回有关用户的声明,就会调用配置文件服务,并可用于添加自定义声明


您可以在用户登录期间添加其他声明。SignInAsync有一个重载,它接受一系列附加声明。 下面是一段代码片段

public async Task<IActionResult> Login(LoginInputModel model)
...
                AuthenticationProperties props = null;
                Claim keepMeLoggedIn = null;
                if (AccountOptions.AllowRememberLogin && model.RememberLogin)
                {
                    props = new AuthenticationProperties
                    {
                        IsPersistent = true,
                        ExpiresUtc = DateTimeOffset.UtcNow.Add(AccountOptions.RememberMeLoginDuration)
                    };
                    keepMeLoggedIn = new Claim(AccountOptions.KeepLoggedInClaim, true.ToString());

                }

                await HttpContext.SignInAsync(userId.ToString(), model.Username, props, keepMeLoggedIn);
公共异步任务登录(LoginInputModel)
...
AuthenticationProperties props=null;
Claim keepMeLoggedIn=null;
if(AccountOptions.AllowRememberLogin&&model.RememberLogin)
{
props=新的AuthenticationProperties
{
ispersist=true,
ExpiresUtc=DateTimeOffset.UtcNow.Add(AccountOptions.rememberLoginDuration)
};
keepMeLoggedIn=newclaim(AccountOptions.KeepLoggedInClaim,true.ToString());
}
等待HttpContext.SignInAsync(userId.ToString(),model.Username,props,keepMeLoggedIn);

请注意,要使此解决方案起作用,必须将您的索赔名称插入到IdentityClaims表中。

只需在登录时将该值添加为索赔。他询问如何在发布索赔时访问Memberme的值。顺便说一句,我也在寻找相同的值。