验证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
相关产品推荐
相关产品推荐

