簡體   English   中英

我想更新 IdentityServer4 (.NET Core 3.1) 中的用戶聲明

[英]I want to Update User Claims in IdentityServer4 (.NET Core 3.1)

問題:

我想刷新身份服務器 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" });
                }

所需的 Output:

我想在我的身份服務器 session 以及 API 和 Ng session 中擁有相同的聲明。 如果您能幫助我,將不勝感激。

您應該在 Identity Server 中檢查您的客戶端 api 的設置。( https://docs.identityserver.io/en/3.1.0/topics/refresh_tokens.ZFC35FDC70D5FC69D2698Z3A82E

檢查此屬性 ( UpdateAccessTokenClaimsOnRefresh ) 是否設置為 true。

此值指示是否應在刷新令牌請求時更新訪問令牌(及其聲明)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM