.NET Core在AzuerAD身份验证后添加声明

.NET Core在AzuerAD身份验证后添加声明,.net,asp.net-core,.net-core,claims-based-identity,microsoft-identity-platform,.net,Asp.net Core,.net Core,Claims Based Identity,Microsoft Identity Platform,我的应用程序通过AzureAD登录,但现在我需要从DB获取信息,然后将角色存储为声明 所以我的问题是:在身份验证之后,如何将角色存储为声明 这就是我所尝试的: var user = User as ClaimsPrincipal; var identity = user.Identity as ClaimsIdentity; identity.AddClaim(new Claim(ClaimTypes.Role, "Admin")); 但当我去另一个控制器,索赔不再存在 感谢您可以在身份验

我的应用程序通过AzureAD登录,但现在我需要从DB获取信息,然后将角色存储为声明

所以我的问题是:在身份验证之后,如何将角色存储为声明

这就是我所尝试的:

var user = User as ClaimsPrincipal;
var identity = user.Identity as ClaimsIdentity;
identity.AddClaim(new Claim(ClaimTypes.Role, "Admin"));  
但当我去另一个控制器,索赔不再存在


感谢

您可以在身份验证过程中,在OIDC中间件中,
OnTokenValidated
为您提供了修改从传入令牌获得的索赔实体的机会,下面的代码供您参考:

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
            .AddAzureAD(options => Configuration.Bind("AzureAd", options));


services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
{
    options.Events = new OpenIdConnectEvents
    {
        OnTokenValidated = ctx =>
        {
            //query the database to get the role

            // add claims
            var claims = new List<Claim>
            {
                new Claim(ClaimTypes.Role, "Admin")
            };
            var appIdentity = new ClaimsIdentity(claims);

            ctx.Principal.AddIdentity(appIdentity);

            return Task.CompletedTask;
        },
    };
});

已经非常感谢你了!如何从那里访问DBContext?我在这个代码段上面注册了它。@bbrinck,试试:
var db=ctx.HttpContext.RequestServices.GetRequiredService()
您也可以在OICD中间件中注销吗?例如,当登录用户在我的数据库中不存在时,或者如果用户的角色尚未设置?或者您是否可以中止登录并以某种方式返回登录窗口?如果为空,您可以使用中间件或操作筛选器或策略检查用户/角色声明,将用户重定向到注销操作。在jwt事件中设置逻辑很奇怪,因为用户已从Azure AD正确验证。
var role = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Role)?.Value;