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

如何通过交互式登录从Azure AD获取自身用户属性(C#实现)

替代弃用ADAL的Azure AD交互式登录方案

1. 替换依赖库

原代码使用的Microsoft.IdentityModel.Clients.ActiveDirectory(ADAL)已被官方弃用,需改用Microsoft.Identity.Client(MSAL)作为身份验证库,搭配Microsoft.Graph调用Microsoft Graph API。

安装必要NuGet包

在控制台项目中执行以下命令安装依赖:

dotnet add package Microsoft.Identity.Client
dotnet add package Microsoft.Graph
dotnet add package Microsoft.Graph.Core

2. 完整实现代码

以下是实现交互式登录并获取指定用户属性的完整代码:

using Microsoft.Identity.Client;
using Microsoft.Graph;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // 配置参数
        string clientId = "你的应用注册客户端ID";
        string tenantId = "你的租户ID(或用common表示任何Azure AD租户)";
        string[] scopes = new[] { "User.Read" }; // 所需权限

        // 初始化MSAL客户端
        var publicClientApp = PublicClientApplicationBuilder
            .Create(clientId)
            .WithAuthority($"https://login.microsoftonline.com/{tenantId}")
            .WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient") // 控制台应用默认重定向URI
            .Build();

        // 交互式登录获取令牌
        AuthenticationResult authResult;
        try
        {
            // 优先从缓存取令牌,无缓存则弹出登录窗口
            var accounts = await publicClientApp.GetAccountsAsync();
            authResult = await publicClientApp.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
                .ExecuteAsync();
        }
        catch (MsalUiRequiredException)
        {
            // 触发交互式登录
            authResult = await publicClientApp.AcquireTokenInteractive(scopes)
                .ExecuteAsync();
        }

        // 初始化Graph客户端
        var graphClient = new GraphServiceClient(
            new DelegateAuthenticationProvider((requestMessage) =>
            {
                requestMessage.Headers.Authorization = 
                    new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.AccessToken);
                return Task.CompletedTask;
            }));

        // 获取指定的用户属性
        var me = await graphClient.Me
            .Request()
            .Select("businessPhones,displayName,givenName,id,jobTitle,mail,mobilePhone,officeLocation,preferredLanguage,surname,userPrincipalName")
            .GetAsync();

        // 输出结果
        Console.WriteLine("用户属性信息:");
        Console.WriteLine($"displayName: {me.DisplayName}");
        Console.WriteLine($"givenName: {me.GivenName}");
        Console.WriteLine($"surname: {me.Surname}");
        Console.WriteLine($"userPrincipalName: {me.UserPrincipalName}");
        Console.WriteLine($"id: {me.Id}");
        Console.WriteLine($"mail: {me.Mail}");
        Console.WriteLine($"jobTitle: {me.JobTitle}");
        Console.WriteLine($"officeLocation: {me.OfficeLocation}");
        Console.WriteLine($"preferredLanguage: {me.PreferredLanguage}");
        if (me.BusinessPhones != null && me.BusinessPhones.Count > 0)
            Console.WriteLine($"businessPhones: {string.Join(", ", me.BusinessPhones)}");
        Console.WriteLine($"mobilePhone: {me.MobilePhone}");
    }
}

3. 关键配置说明

  • 应用注册设置:在Azure AD应用注册中,需配置重定向URI为https://login.microsoftonline.com/common/oauth2/nativeclient,并添加User.Read委托权限(可由管理员统一授权,或由登录用户自行同意)。
  • 权限说明:User.Read权限足够读取登录用户的所有目标属性。
  • 令牌缓存:代码优先尝试从本地缓存获取令牌,避免重复弹出登录窗口,优化使用体验。

4. 运行说明

启动控制台应用后,会自动弹出Azure AD标准登录窗口,用户完成身份验证后,控制台将输出指定的用户属性信息。

内容的提问来源于stack exchange,提问作者toparge nz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:35:58