基于Azure AD的服务器间身份验证配置异常排查
Azure AD服务器到服务器API认证未授权问题排查
问题描述
尝试通过Azure AD实现API间的服务器到服务器身份验证,已完成以下配置但调用目标API始终返回**未授权(Unauthorized)**异常:
- 配置了appsettings中的AzureAd节点
- Startup中添加了认证授权中间件
- 控制器添加了
[Authorize]属性 - 完成Azure AD应用注册的API暴露与权限配置,且验证凭据无误
相关配置代码
Token生成代码
var oauthApi = RestService.For<IMidaApi>( $"https://login.microsoftonline.com/{_settings.TenantId}", new RefitSettings(new NewtonsoftJsonContentSerializer()) ); var data = new Dictionary<string, string> { { "grant_type", "client_credentials" }, { "client_id", _settings.ClientId}, { "client_secret", _settings.SecretKey }, { "scope", "api://1d1d113c-4b3b-****-******-********/.default" }, }; var response = await oauthApi.GetTokenAsync(data);
appsettings配置
"AzureAd": { "Instance": "https://sts.windows.net/", "Audience": "api://1d1d113c-4b3b-4a2e-****-***********", "ClientId": "1d1d113c-4b3b-4a2e-****-***********", "TenantId": "3be67c15-c670-43c3-****-***********" }
Startup配置
services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration);
app.UseAuthentication(); app.UseAuthorization();
可能遗漏的配置点
- Instance地址不匹配:当前appsettings中
Instance使用https://sts.windows.net/,但获取token的地址是https://login.microsoftonline.com/,两者不一致会导致中间件验证token时issuer校验失败。需将appsettings的Instance统一修改为https://login.microsoftonline.com/。 - Scope与Audience一致性检查:确认token请求中的
scope对应的API ID(api://1d1d113c-4b3b-****-******-********)和appsettings中的Audience完全一致,包括GUID、后缀字符等细节。 - 应用权限未授予管理员同意:客户端应用注册中添加的目标API客户端类型权限,必须由租户管理员授予管理员同意,否则token中不会包含有效权限声明,API验证不通过。
- Token请求头附加错误:确认获取token后,是否将其以
Authorization: Bearer {token}的格式正确添加到HttpClient的请求头中,这是常见的遗漏步骤。 - API应用受众配置同步:目标API应用注册中暴露的API的
Application ID URI,必须和token中的aud声明、appsettings中的Audience完全一致,若有修改需同步所有配置项。 - Issuer验证配置:若租户为特定场景,可在AzureAd节点添加
"ValidIssuers": ["https://login.microsoftonline.com/{TenantId}/v2.0"],确保中间件正确识别token的发行方。
内容的提问来源于stack exchange,提问作者Kittu
相关产品推荐
相关产品推荐

