.NET Core在AzuerAD身份验证后添加声明
我的应用程序通过AzureAD登录,但现在我需要从DB获取信息,然后将角色存储为声明 所以我的问题是:在身份验证之后,如何将角色存储为声明 这就是我所尝试的:.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")); 但当我去另一个控制器,索赔不再存在 感谢您可以在身份验
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;