Asp.Net Core刷新AzureAD声明

时间:2019-07-13 13:38:46

标签: asp.net-core azure-active-directory

我有一个Asp.Net Core 2.1 Web应用程序,它使用AzureAD来验证我的用户。在Startup.cs文件中,我使用OpenIDConnectOptions的OnTokenValidated事件在SQL数据库中查找用户,并根据数据库中设置的值添加我自己的Role声明。 这可以工作,但是出于测试不同角色的目的,我必须先更新数据库,然后注销并再次登录以测试处于不同角色。

为了简化操作,我有一些按钮,允许用户选择新角色并更新数据库。不幸的是,他们仍然需要注销然后重新登录才能影响角色。因此,是否有可能更改Role声明,或更简单地只是从AD刷新声明并重新触发该OnTokenValidated事件,从而将我的角色设置为新值。

2 个答案:

答案 0 :(得分:0)

您最好注销用户,然后让用户重新登录以刷新原理。

刷新AD的声明将无效,因为AAD令牌中涉及的角色基于Azure资源,这些角色与本地数据库中的用户角色无关。

还有另一种方法,可以在Cookie验证过程中无损更新用户主体,调用xarray并将context.ReplacePrincipal属性设置为true:

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?view=aspnetcore-2.2#react-to-back-end-changes

但是如文档所示:

  

此处描述的方法是在每个请求上触发的。在每个请求上验证所有用户的身份验证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