咨询:身份验证后获取外部用户JWT令牌中的应用角色
解决外部来宾用户JWT令牌缺失角色的问题
1. 修改Azure AD应用程序清单开启角色声明
来宾用户的roles声明默认不会自动包含在ID/访问令牌中,需要手动配置应用清单:
- 登录Azure门户,找到对应应用注册,进入清单标签。
- 找到
optionalClaims节点,添加或更新idToken和accessToken的配置,确保包含roles:
"optionalClaims": { "idToken": [ { "name": "roles", "source": null, "essential": false, "additionalProperties": [] } ], "accessToken": [ { "name": "roles", "source": null, "essential": false, "additionalProperties": [] } ] }
- 保存清单,等待配置生效(通常几分钟)。
2. 确认角色分配的有效性
- 确保角色是分配给来宾用户本人,或是包含来宾用户的安全组(Office 365组无法同步角色到令牌)。
- 检查企业应用的用户和组列表,确认来宾用户/所属安全组已被分配
External.Only角色,状态为启用。
3. 配置.NET Core API的令牌解析
在API的Program.cs中,确保身份验证服务正确识别roles声明:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd")) .EnableTokenAcquisitionToCallDownstreamApi() .AddInMemoryTokenCaches(); // 显式指定角色声明类型,避免解析异常 builder.Services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options => { options.TokenValidationParameters.RoleClaimType = "roles"; });
4. 检查前端MSAL的权限请求配置
Angular前端使用MSAL时,确保请求的令牌包含API的正确权限范围:
- 在MSAL配置的
protectedResourceMap中,指定API对应的权限范围(需提前在Azure AD应用注册中配置为委派权限并完成管理员同意):
export const protectedResourceMap = new Map([ ['https://your-api-endpoint', ['api://your-api-client-id/access_as_user']] ]);
- 登录请求必须包含上述权限范围,否则访问令牌不会携带角色信息。
5. 强制刷新会话验证
如果以上配置都正确但令牌仍无角色:
- 让外部用户清除浏览器缓存后重新登录。
- 在Azure AD中找到该来宾用户,进入会话页面强制注销现有会话,再重新登录。
内容的提问来源于stack exchange,提问作者Nag Arjun
相关产品推荐
相关产品推荐

