ASP.NET中通过OpenIDConnect/SAML2登录AzureAD后,如何获取用户属性?
如何在ASP.NET中通过OpenID Connect登录Azure AD后检索用户属性
我来帮你梳理下登录Azure AD后获取用户属性的具体方法,结合你现有的代码一步步调整:
第一步:调整OpenID Connect配置,请求所需属性
你当前的代码只请求了OpenIdProfile范围,这只能拿到基础用户资料(比如姓名)。如果需要邮箱这类属性,得先扩展请求范围,同时根据需求调整响应类型:
app.UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions { ClientId = clId, Authority = authUrl, RedirectUri = redirectUrl, PostLogoutRedirectUri = logoutUrl, // 新增Email范围,确保Azure AD返回邮箱相关声明 Scope = OpenIdConnectScope.OpenIdProfile + " " + OpenIdConnectScope.Email, // 若需要调用Graph API获取更多属性,将响应类型改为IdToken+Code ResponseType = OpenIdConnectResponseType.IdTokenCode, TokenValidationParameters = new TokenValidationParameters() { ValidateIssuer = false }, // 添加通知处理,用于后续获取令牌或处理登录事件 Notifications = new OpenIdConnectAuthenticationNotifications { AuthorizationCodeReceived = async context => { // 这里可以处理授权码,用于获取Graph API访问令牌 }, AuthenticationFailed = context => { context.HandleResponse(); context.Response.Redirect("/Error?message=" + context.Exception.Message); return Task.FromResult(0); } } } );
第二步:从ClaimsPrincipal直接获取基础属性
登录成功后,用户身份信息会存储在HttpContext.Current.User(或MVC中的User属性)里,它是ClaimsPrincipal对象,包含Azure AD返回的所有声明。你可以直接从中提取邮箱、姓名等:
// 获取邮箱地址(优先取email声明) var email = User.Claims.FirstOrDefault(c => c.Type == "email")?.Value; // 若email声明不存在,可尝试取UPN(用户主体名称,通常也是邮箱格式) var upn = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Upn)?.Value; // 获取用户全名 var fullName = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name)?.Value;
小提示:不同租户的声明类型可能略有差异,你可以打印所有声明确认具体字段:
foreach (var claim in User.Claims) { Debug.WriteLine($"声明类型: {claim.Type}, 值: {claim.Value}"); }
第三步:调用Microsoft Graph API获取更多属性
如果需要部门、职位、手机号这类更详细的属性,就得用授权码获取Graph API的访问令牌,然后调用接口:
先安装Microsoft.Identity.Client NuGet包,再在AuthorizationCodeReceived通知中实现逻辑:
AuthorizationCodeReceived = async context => { var clientId = clId; var authority = authUrl; var redirectUri = redirectUrl; var clientSecret = "你的Azure AD应用客户端密钥"; // 使用MSAL获取Graph API访问令牌 var cca = ConfidentialClientApplicationBuilder .Create(clientId) .WithClientSecret(clientSecret) .WithAuthority(new Uri(authority)) .WithRedirectUri(redirectUri) .Build(); var result = await cca.AcquireTokenByAuthorizationCode( new[] { "https://graph.microsoft.com/User.Read" }, context.Code) .ExecuteAsync(); // 调用Graph API获取用户完整信息 var graphClient = new HttpClient(); graphClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken); var userResponse = await graphClient.GetAsync("https://graph.microsoft.com/v1.0/me"); if (userResponse.IsSuccessStatusCode) { var userData = await userResponse.Content.ReadAsStringAsync(); // 解析JSON获取所需属性,比如部门、职位等 // var user = JsonConvert.DeserializeObject<UserModel>(userData); } }
额外注意事项
- 确保你的Azure AD应用注册中已添加
User.Read等所需API权限,并完成管理员授权(租户级应用需要)。 - 若只需要基础邮箱属性,仅调整
Scope为OpenIdProfile Email即可,无需修改ResponseType或调用Graph API。
内容的提问来源于stack exchange,提问作者Echodaa
相关产品推荐
相关产品推荐

