我有一个应用程序,AzureAD 登录工作正常。但是,我想确定用户是否处于应用程序注册中定义的自定义角色。
我已将我的用户帐户添加到链接到应用程序注册的企业应用程序中的自定义角色。
应用程序注册已设置并选中 ID 令牌。
我的program.cs包含以下代码:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));
builder.Services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.TokenValidationParameters.RoleClaimType = "roles";
});
然而,当查看 User 对象时,它包含我所有的用户信息,但没有角色声明。
知道为什么吗?
提前致谢, 杰克。
要获取 ID 令牌中的 Azure AD 角色声明,请检查以下内容:
在 Azure AD 应用程序中创建应用程序角色:
在企业应用程序中,我添加了用户的角色:
现在,我使用以下参数通过Postman生成了令牌:
https://login.microsoftonline.com/TenantID/oauth2/v2.0/token
client_id:ClientID
scope:ClientID/.default openid
code:code
redirect_uri:https://jwt.ms
grant_type:authorization_code
client_secret:ClientSecret
当我解码ID令牌时,角色显示成功:
角色声明也将显示在访问令牌中:
现在,我尝试使用应用程序中未分配任何角色的用户登录,并且角色声明未显示在 ID 令牌中:
要使用 ASP.NET Core Web 应用程序获取 Azure AD 角色声明,请参阅 aremo-ms 的此 GitHub 博客。
在您的
Startup.cs
文件中修改如下代码:
public void ConfigureServices(IServiceCollection services)
{
JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.TokenValidationParameters.RoleClaimType = "roles";
});
services.AddAuthorization(options =>
{
options.AddPolicy(AuthorizationPolicies.AssignmentToUserReaderRoleRequired, policy => policy.RequireRole(AppRole.UserReaders));
options.AddPolicy(AuthorizationPolicies.AssignmentToDirectoryViewerRoleRequired, policy => policy.RequireRole(AppRole.DirectoryViewers));
});
}
// In code..(Controllers & elsewhere)
[Authorize(Policy = AuthorizationPolicies.AssignmentToDirectoryViewerRoleRequired)]
// or
User.IsInRole("UserReaders"); // In methods
参考: