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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:02:13