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

C#中无法获取Azure AD令牌,请求解决AADSTS7000218错误

解决AADSTS7000218错误:请求缺少client_assertion或client_secret参数

错误原因

你当前使用的AcquireTokenAsync重载仅适用于公共客户端应用(如桌面APP、移动APP),但你的Azure AD应用注册被配置为机密客户端(如Web应用/API)。机密客户端要求在令牌请求中提供客户端凭据(client_secret或client_assertion)以验证自身身份,未提供时就会触发该错误。

解决方案

方案1:将Azure AD应用改为公共客户端类型

如果你的应用属于桌面/移动类公共客户端,可修改应用注册设置:

  • 登录Azure门户,找到目标应用注册
  • 进入身份验证页面
  • 在高级设置中,将允许公共客户端流设为"是"
  • 保存后,原代码无需修改即可正常运行

方案2:在代码中添加客户端凭据(适用于机密客户端)

如果你的应用确实是机密客户端(如Web应用),需修改代码传入客户端密钥或断言:

使用Client Secret的示例代码

AuthenticationContext authContext = new AuthenticationContext(authority);
// 创建客户端凭据对象
ClientCredential clientCredential = new ClientCredential(clientID, clientSecret);
// 使用带客户端凭据的AcquireTokenAsync重载
string token = authContext.AcquireTokenAsync(resourceUri, clientCredential)
                          .Result.AccessToken;

需要用户交互(含MFA)的场景

若需结合用户交互(用户名密码+双因素认证),推荐使用授权码流程:

// 第一步:生成授权请求URL,引导用户完成登录和MFA,获取授权码
string authorizationUrl = authContext.GetAuthorizationRequestUrl(
    resourceUri, 
    clientID, 
    new Uri(redirectUri), 
    PromptBehavior.Auto
).ToString();
// 需引导用户访问该URL,从回调中提取授权码(code参数)

// 第二步:用授权码+客户端凭据兑换令牌
AuthenticationResult result = await authContext.AcquireTokenByAuthorizationCodeAsync(
    authorizationCode, 
    new Uri(redirectUri), 
    clientCredential
);
string token = result.AccessToken;

补充:AuthenticationContext属于ADAL库,微软现已推荐使用MSAL库(Microsoft.Identity.Client)替代ADAL,MSAL的API更简洁且支持更多场景,新项目建议迁移至MSAL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:30:21