基于Azure AD认证的ASP.NET Core应用能否获取更多用户属性作为声明?
在ASP.NET Core Azure AD认证中添加更多用户属性为声明
当然可以,主要有两种途径实现这个需求:
1. 通过Azure门户配置可选声明
这是最简单的方式,直接在Azure AD应用注册里指定要返回的额外属性:
- 登录Azure门户,找到你的应用注册
- 进入令牌配置页面,点击「添加可选声明」
- 选择要配置的令牌类型(ID令牌或访问令牌),然后勾选需要的属性,比如
email、family_name、given_name、jobTitle等 - 保存配置后,用户重新登录应用,
ClaimsPrincipal里就会自动带上这些新增的声明
2. 自定义处理或调用Graph API获取更多属性
如果Azure提供的可选声明不够用,还可以在代码里自定义处理:
方式一:解析令牌添加声明
在认证配置的OnTokenValidated事件中,直接从令牌里提取额外字段并添加为声明:
services.AddAuthentication(AzureADDefaults.AuthenticationScheme) .AddAzureAD(options => Configuration.Bind("AzureAd", options)); services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options => { options.Events = new OpenIdConnectEvents { OnTokenValidated = context => { // 从令牌中提取jobTitle属性并添加为自定义声明 var jobTitle = context.Principal.FindFirst("jobTitle")?.Value; if (!string.IsNullOrEmpty(jobTitle)) { context.Principal.Identities.First().AddClaim(new Claim("job_title", jobTitle)); } return Task.CompletedTask; } }; });
方式二:调用Graph API获取更多属性
如果需要的属性不在令牌里,可以调用Microsoft Graph API获取用户的完整信息,再添加为声明:
services.AddAuthentication(AzureADDefaults.AuthenticationScheme) .AddAzureAD(options => Configuration.Bind("AzureAd", options)); services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options => { options.Events = new OpenIdConnectEvents { OnTokenValidated = async context => { // 初始化Graph客户端,使用当前用户的令牌 var graphClient = new GraphServiceClient( new DelegateAuthenticationProvider(request => { request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.SecurityToken.RawData); return Task.CompletedTask; }) ); // 获取用户的部门信息 var user = await graphClient.Me.Request().GetAsync(); if (!string.IsNullOrEmpty(user.Department)) { context.Principal.Identities.First().AddClaim(new Claim("department", user.Department)); } return Task.CompletedTask; } }; });
注意:调用Graph API需要给应用注册添加
User.Read这类委托权限,并且确保用户登录时同意该权限。
内容的提问来源于stack exchange,提问作者whatever
相关产品推荐
相关产品推荐

