Blazor应用中使用Microsoft Entra认证时如何获取可选声明
问题描述
已在Blazor中完成Microsoft Entra认证配置且运行正常,但无法获取已在Entra中添加的三个可选声明,仅能拿到8个默认声明。当前Program.cs中的认证配置代码如下:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(options => { IConfigurationSection section = builder.Configuration.GetSection("AzureAd"); string? instance = section["Instance"]; ArgumentException.ThrowIfNullOrWhiteSpace(instance); options.Instance = instance; string? domain = section["Domain"]; ArgumentException.ThrowIfNullOrWhiteSpace(domain); options.Domain = domain; string? tenantId = section["TenantId"]; ArgumentException.ThrowIfNullOrWhiteSpace(tenantId); options.TenantId = tenantId; string? clientId = section["ClientId"]; ArgumentException.ThrowIfNullOrWhiteSpace(clientId); options.ClientId = clientId; string? callbackPath = section["CallbackPath"]; ArgumentException.ThrowIfNullOrWhiteSpace(callbackPath); options.CallbackPath = callbackPath; });
推测需要指定认证作用域,但不清楚具体操作方式。
解决方案
1. 添加必要的作用域
要获取额外声明,需在认证配置中添加对应的OpenID Connect作用域。常见作用域包括profile(获取用户基本信息)、email(获取邮箱声明);若添加的是自定义声明,需确保客户端有权限访问对应资源。
在AddMicrosoftIdentityWebApp的配置委托中添加作用域:
options.Scope.Add("profile"); options.Scope.Add("email"); // 自定义声明对应的作用域需在此补充
2. 启用从UserInfo端点获取声明
部分声明不会直接包含在ID令牌中,需通过调用UserInfo端点获取,开启该选项:
options.GetClaimsFromUserInfoEndpoint = true;
3. 验证Entra中的可选声明配置
- 登录Microsoft Entra管理中心,找到目标应用注册
- 进入令牌配置 -> 添加可选声明,确认添加的声明针对ID令牌(Blazor认证通常依赖ID令牌)
- 确保声明状态为已启用
修改后的完整代码示例
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(options => { IConfigurationSection section = builder.Configuration.GetSection("AzureAd"); string? instance = section["Instance"]; ArgumentException.ThrowIfNullOrWhiteSpace(instance); options.Instance = instance; string? domain = section["Domain"]; ArgumentException.ThrowIfNullOrWhiteSpace(domain); options.Domain = domain; string? tenantId = section["TenantId"]; ArgumentException.ThrowIfNullOrWhiteSpace(tenantId); options.TenantId = tenantId; string? clientId = section["ClientId"]; ArgumentException.ThrowIfNullOrWhiteSpace(clientId); options.ClientId = clientId; string? callbackPath = section["CallbackPath"]; ArgumentException.ThrowIfNullOrWhiteSpace(callbackPath); options.CallbackPath = callbackPath; // 添加所需作用域 options.Scope.Add("profile"); options.Scope.Add("email"); // 自定义声明作用域在此添加 // 启用从UserInfo端点获取声明 options.GetClaimsFromUserInfoEndpoint = true; });
额外检查
- 清除浏览器缓存后重新登录,避免旧令牌干扰
- 通过
User.Claims遍历所有声明,确认新声明是否已加载
内容的提问来源于stack exchange,提问作者Bjoern
相关产品推荐
相关产品推荐

