如何通过交互式登录从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
相关产品推荐
相关产品推荐

