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

验证Azure AD Access Token时出现空引用异常求助

解决Azure AD Access Token验证时的空引用异常

问题根源分析

你的代码存在几个关键错误,直接触发了空引用异常:

  • 错误的OpenID发现端点:使用common通用端点但指定了具体租户ID,导致获取的签名密钥无法匹配当前租户的Token。
  • 冲突的签名密钥配置:同时设置IssuerSigningKeys(从发现文档获取的非对称公钥)和IssuerSigningKey(对称密钥),Azure AD Access Token采用非对称加密签名,不需要对称密钥参数,两者共存会导致验证逻辑混乱。
  • 多余的Token初始化:提前初始化validatedToken为new JwtSecurityToken(),干扰了ValidateToken方法的out参数逻辑。
  • 潜在的Token变量无效:需确保token变量是有效的Azure AD Access Token字符串,未被赋值为空或格式错误。

修正后的代码

string myTenant = "TENANT ID";
var myAudience = "CLIENT ID";
var myIssuer = String.Format(CultureInfo.InvariantCulture, "https://login.microsoftonline.com/{0}/v2.0", myTenant);

// 使用租户专属的OpenID发现端点
var stsDiscoveryEndpoint = String.Format(CultureInfo.InvariantCulture, "https://login.microsoftonline.com/{0}/v2.0/.well-known/openid-configuration", myTenant);
var configManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint, new OpenIdConnectConfigurationRetriever());
var config = await configManager.GetConfigurationAsync();

var tokenHandler = new JwtSecurityTokenHandler();

var validationParameters = new TokenValidationParameters
{
    ValidAudience = myAudience,
    ValidIssuer = myIssuer,
    IssuerSigningKeys = config.SigningKeys,
    ValidateLifetime = false // 调试阶段关闭,生产环境建议开启
};

SecurityToken validatedToken;
// 确保token为有效的Azure AD Access Token字符串
tokenHandler.ValidateToken(token, validationParameters, out validatedToken);

// 验证成功后可查看Token详情
var jwtToken = (JwtSecurityToken)validatedToken;
Console.WriteLine($"验证成功,Token主题:{jwtToken.Subject}");

额外注意事项

  • 确认myAudience是你要访问的目标API的客户端ID,而非当前应用的客户端ID。
  • 生产环境必须开启ValidateLifetime = true,避免使用过期Token。
  • 客户端Secret仅用于获取Token的流程,不需要参与Token签名验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:55:27