【发布时间】: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