我有一个Asp.Net Core 2.1 Web应用程序,它使用AzureAD来验证我的用户。在Startup.cs文件中,我使用OpenIDConnectOptions的OnTokenValidated事件在SQL数据库中查找用户,并根据数据库中设置的值添加我自己的Role声明。 这可以工作,但是出于测试不同角色的目的,我必须先更新数据库,然后注销并再次登录以测试处于不同角色。
为了简化操作,我有一些按钮,允许用户选择新角色并更新数据库。不幸的是,他们仍然需要注销然后重新登录才能影响角色。因此,是否有可能更改Role声明,或更简单地只是从AD刷新声明并重新触发该OnTokenValidated事件,从而将我的角色设置为新值。
答案 0 :(得分:0)
您最好注销用户,然后让用户重新登录以刷新原理。
刷新AD的声明将无效,因为AAD令牌中涉及的角色基于Azure资源,这些角色与本地数据库中的用户角色无关。
还有另一种方法,可以在Cookie验证过程中无损更新用户主体,调用xarray
并将context.ReplacePrincipal
属性设置为true:
但是如文档所示:
此处描述的方法是在每个请求上触发的。在每个请求上验证所有用户的身份验证Cookie可能会导致该应用程序的性能大幅下降。
所以只要注销用户,然后更改后端,就让他重新登录。
答案 1 :(得分:0)
我已经能够使用以下代码来满足我的要求:
public async Task<IActionResult> ChangeRole(string role)
{
var principal = HttpContext.User;
var customIdentity = principal.Identities.FirstOrDefault(x => x.Claims.Any(y => y.Type == ClaimTypes.Role));
if (customIdentity != null)
{
if (Enum.IsDefined(typeof(Role), role))
{
customIdentity.RemoveClaim(customIdentity.Claims.First(x => x.Type == ClaimTypes.Role));
customIdentity.AddClaim(new Claim(ClaimTypes.Role, role));
}
}
await HttpContext.SignInAsync(new ClaimsPrincipal(principal));
return RedirectToAction("Index", "Home");
}strong text