You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:59:53