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

C#连接Azure AD时AcquireTokenAsync(string,ClientCredential)已过时的替代方案

问题说明

AuthenticationContext.AcquireTokenAsync(string, ClientCredential)是旧版ADAL(Azure Active Directory Authentication Library)中的方法,目前已被微软标记为过时,且ADAL整体已经停止官方维护,不再接收功能更新与安全补丁,官方推荐的替代方案是迁移至MSAL(Microsoft Identity Client,对应NuGet包Microsoft.Identity.Client)实现认证逻辑。

迁移实现方案
  • 清理项目依赖:卸载项目中旧的ADAL包(通常为Microsoft.IdentityModel.Clients.ActiveDirectory),安装最新稳定版的Microsoft.Identity.ClientNuGet包。
  • 替换认证对象初始化逻辑:MSAL中不再使用AuthenticationContext类,客户端凭证场景下使用ConfidentialClientApplication完成客户端实例构建,构建时需要传入客户端ID、租户信息、客户端凭证(密钥或证书)三类核心参数。
  • 替换令牌获取方法:使用AcquireTokenForClient方法替代旧的AcquireTokenAsync完成令牌获取,该方法是MSAL中专门为客户端凭证流设计的官方实现。
代码对比

旧版过时写法(ADAL)

var authContext = new AuthenticationContext("https://login.microsoftonline.com/{替换为你的租户ID}");
var clientCredential = new ClientCredential("替换为你的客户端ID", "替换为你的客户端密钥");
var authResult = await authContext.AcquireTokenAsync("https://graph.microsoft.com", clientCredential);
var accessToken = authResult.AccessToken;

新版推荐写法(MSAL)

var confidentialClient = ConfidentialClientApplicationBuilder
    .Create("替换为你的客户端ID")
    .WithClientSecret("替换为你的客户端密钥")
    .WithAuthority(new Uri("https://login.microsoftonline.com/{替换为你的租户ID}"))
    .Build();

// 客户端凭证流的权限范围需在资源地址后追加/.default后缀
var scopes = new[] { "https://graph.microsoft.com/.default" };
var authResult = await confidentialClient.AcquireTokenForClient(scopes).ExecuteAsync();
var accessToken = authResult.AccessToken;
迁移注意事项
  • MSAL内置令牌缓存机制,重复调用AcquireTokenForClient时会自动校验缓存中令牌的有效期,直接返回未过期的缓存令牌,无需手动实现缓存判断逻辑。
  • 权限范围(scope)的写法和ADAL存在差异:ADAL仅需传入资源根地址即可,MSAL客户端凭证流必须在资源地址后拼接/.default后缀,代表调用Azure门户中提前为该应用配置的静态应用权限。
  • 如果你使用证书而非客户端密钥做认证,仅需将构建客户端时的WithClientSecret方法替换为WithCertificate方法传入证书对象即可,其余逻辑无需改动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 19:06:40