【问题标题】:I want to Update User Claims in IdentityServer4 (.NET Core 3.1)我想更新 IdentityServer4 (.NET Core 3.1) 中的用户声明
【发布时间】:2022-06-13 15:46:20
【问题描述】:

问题:

我想刷新身份服务器 4 中的用户声明。我在身份服务器项目中创建了一个 API 端点。下面给出了这个 API 端点。之后,我使用 oidc-client.js 库从我的 Angular 客户端调用 UserInfoEndpoint 和 RefreshTokenEndpoint。我得到了 refreshtoken 和新的 accesstoken,但响应中的声明是旧的。我必须重新登录我的客户端和身份服务器才能重新加载更新的声明。

API 代码

   if (ModelState.IsValid && model.IsSelected && User.Identity.IsAuthenticated)
                {
                    var user = _userRepository.GetUserByAppId(model.UserId);
                    user.AccessCode = model.Code; // A simple 3 digit code
                    var updatedUser = _userRepository.UpdateUser(user); //updating it in the dB
                    var claimsResult = _userRepository.GetUserClaims(updatedUser);
                    if (!claimsResult.IsSuccess)
                    {
                        return BadRequest(new { Status = false, Message = "Failed To Change" });
                    }
                    var identity = User.Identity as ClaimsIdentity;
                    string[] claimsTobeUpdated = { "AccessCode" };
                    foreach (var item in identity.Claims.ToList())
                    {
                        if (claimsTobeUpdated.Contains(item.Type))
                        {
                            identity.RemoveClaim(item);
                            var claim = claimsResult.Claims.Where(p => p.Type == item.Type).FirstOrDefault();
                            identity.AddClaim(claim);
                        }
                    } // I was updating more than one claims thats why I'm iterating
                    AuthenticationProperties props = new AuthenticationProperties()
                    {
                        IsPersistent = true,
                        ExpiresUtc = DateTimeOffset.UtcNow.Add(AccountOptions.RememberMeLoginDuration),
                    };

                    // issue authentication cookie with subject ID and username
                    var isuser = new IdentityServerUser(user.Id.ToString())
                    {
                        DisplayName = user.Name,
                        AdditionalClaims = claimsResult.Claims.ToList(),
                    };
                    await HttpContext.SignInAsync(isuser, props);


                    var claims = User.Identity as ClaimsIdentity; // here I've checked that the claims updated or not and these are updated.

                    return Ok(new { Status = true, Message = "Changed Successfully" });
                }

期望的输出:

我想在我的身份服务器会话以及 API 和 Ng 会话中拥有相同的声明。如果您能帮助我,我们将不胜感激。

【问题讨论】:

  • 嗨 Ahmed Naeem,您可以检查生成 refreshtoken 和新访问令牌的代码,它是否生成带有新声明的 refreshtoken?
  • 清,我已经尝试了刷新令牌的事情,从我的 Angular 客户端请求了新的访问令牌,但是配置文件(用户声明)没有刷新,新的访问令牌和刷新令牌被成功替换

标签: c# asp.net asp.net-core identityserver4 claims-based-identity


【解决方案1】:

您应该检查 Identity Server 中客户端 api 的设置。(https://docs.identityserver.io/en/3.1.0/topics/refresh_tokens.html)

检查此属性 (UpdateAccessTokenClaimsOnRefresh) 是否设置为 true

此值指示是否应在刷新令牌请求时更新访问令牌(及其声明)。

【讨论】:

    猜你喜欢
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-13
    • 2021-06-22
    • 2021-02-26
    • 1970-01-01
    • 2021-04-29
    相关资源
    最近更新 更多