令牌中缺少 Azure AD 角色声明

问题描述 投票:0回答:1

我有一个应用程序,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 对象时,它包含我所有的用户信息,但没有角色声明。

知道为什么吗?

提前致谢, 杰克。

azure-active-directory access-token roles microsoft-identity-platform
1个回答
0
投票

要获取 ID 令牌中的 Azure AD 角色声明,请检查以下内容:

在 Azure AD 应用程序中创建应用程序角色

enter image description here

在企业应用程序中,我添加了用户的角色:

enter image description here

现在,我使用以下参数通过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

enter image description here

当我解码ID令牌时,角色显示成功:

enter image description here

角色声明也将显示在访问令牌中:

enter image description here

现在,我尝试使用应用程序中未分配任何角色的用户登录,并且角色声明未显示在 ID 令牌中:

enter image description here

要使用 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

参考:

添加应用程序角色并从令牌获取它们 - Microsoft Entra

© www.soinside.com 2019 - 2024. All rights reserved.