gpt4 book ai didi

c# - .NET Core 2/Identity Server 4 - 刷新所有声明

转载 作者:太空宇宙 更新时间:2023-11-03 12:20:56 28 4
gpt4 key购买 nike

我有一个使用 Identity Server 4 的 .net 核心应用程序,它在应用程序中创建了许多非标准的授权声明。其中一些非标准声明直接影响应用程序的行为方式并由数据库设置。如果用户在 UI 上执行某些操作,我将需要重置这些声明。

所以我的问题是,如果我执行此处找到的更新 token ,则使用混合流程 https://github.com/IdentityServer/IdentityServer4.Samples/blob/release/Clients/src/MvcHybrid/Controllers/HomeController.cs ,那会调用用户信息端点来获取更新的声明列表吗?所以或多或少,重置登录而不必注销并重新登录。或者我需要手动更新 Claims 主体吗?

我宁愿不必手动更新主体,而让 IS4 完成繁重的工作。

编辑

使用上面的代码我能够刷新 token ,我看到它正在调用 IS4 并重置 IS4 代码中的声明,但它没有获取用户配置文件,这实际上并没有更新客户端的声明。我无法将声明保存在 token 中,因为 token 变得太大而无法注销,所以我在选项上启用了“GetClaimsFromUserInfoEndpoint”。无论如何以编程方式重置用户配置文件?

最佳答案

找到了!使用示例代码中的刷新 token ,您将需要手动调用 UserInfo 端点以在您验证 cookie 之后但在登录 cookie 之前获取更新的声明列表。

var disco = await DiscoveryClient.GetAsync(this.applicationSettings.IdentityServerAuthority);
if (disco.IsError) throw new Exception(disco.Error);

var userInfoClient = new UserInfoClient(disco.UserInfoEndpoint);
var tokenClient = new TokenClient(disco.TokenEndpoint, this.applicationSettings.IdentityServerAuthorityClient, this.applicationSettings.IdentityServerAuthorityPassword);
var rt = await this.httpContext.HttpContext.GetTokenAsync("refresh_token");
var tokenResult = await tokenClient.RequestRefreshTokenAsync(rt);

if (!tokenResult.IsError)
{
var old_id_token = await this.httpContext.HttpContext.GetTokenAsync("id_token");
var new_access_token = tokenResult.AccessToken;
var new_refresh_token = tokenResult.RefreshToken;

var tokens = new List<AuthenticationToken>();
tokens.Add(new AuthenticationToken { Name = OpenIdConnectParameterNames.IdToken, Value = old_id_token });
tokens.Add(new AuthenticationToken { Name = OpenIdConnectParameterNames.AccessToken, Value = new_access_token });
tokens.Add(new AuthenticationToken { Name = OpenIdConnectParameterNames.RefreshToken, Value = new_refresh_token });

var expiresAt = DateTime.UtcNow + TimeSpan.FromSeconds(tokenResult.ExpiresIn);
tokens.Add(new AuthenticationToken { Name = "expires_at", Value = expiresAt.ToString("o", CultureInfo.InvariantCulture) });
var info = await this.httpContext.HttpContext.AuthenticateAsync("Cookies");
//get the updated user profile (claims)
var response = await userInfoClient.GetAsync(new_access_token);
info.Properties.StoreTokens(tokens);

//merge the new claims with the current principal
var currentIdentity = info.Principal.Identity as ClaimsIdentity;
var distinctClaimTypes = response.Claims.Select(x => x.Type).Distinct();
foreach (var claimType in distinctClaimTypes)
{
var currentCount = currentIdentity.Claims.Count(x => x.Type == claimType);
if (currentCount > 0)
{
//remove the claims from the current
var currentClaims = currentIdentity.Claims.Where(x => x.Type == claimType).ToList();
foreach (var currentClaim in currentClaims)
{
currentIdentity.RemoveClaim(currentClaim);
}
}

//add the new claims
currentIdentity.AddClaims(response.Claims.Where(x => x.Type == claimType));
}

//update the cookies with the new principal and identity
await this.httpContext.HttpContext.SignInAsync("Cookies", info.Principal, info.Properties);

return true;
}

可能还有一种方法可以使用“oidc”进行身份验证/登录。我试过了,但无法让它工作。

关于c# - .NET Core 2/Identity Server 4 - 刷新所有声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47320537/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com