同一Azure租户下跨应用的SSO ID Token能否在API中验证?
问题解答与实践方案
1. App2的ID Token能否在App1 API中验证?
可以,但默认的JWT验证逻辑会失败——因为ID Token的aud(受众)字段是App2的客户端ID,而非App1的API ID。要验证通过,你需要调整验证规则,同时确保两个核心前提:
- App1与App2处于同一Azure AD租户
- ID Token由该租户的Azure AD合法颁发(通过签名和 issuer 验证即可确认)
注意:ID Token的设计初衷是供前端应用自身做身份校验,调用后端API更规范的凭证是Access Token。但如果坚持要验证跨应用的ID Token,可按以下方案实现。
2. 代码示例(.NET Core API)
使用Microsoft.Identity.Web库实现自定义验证逻辑,无需手动处理私钥(Azure AD会通过公钥端点自动提供验证所需的公钥):
首先安装依赖包:
Install-Package Microsoft.Identity.Web
在Program.cs中配置认证服务,添加自定义受众验证:
var builder = WebApplication.CreateBuilder(args); // 配置Azure AD认证 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(options => { builder.Configuration.Bind("AzureAd", options); // 配置允许的受众:App1自身API ID + 同一租户内的App2客户端ID options.TokenValidationParameters.ValidAudiences = new[] { builder.Configuration["AzureAd:ClientId"], // App1的API注册ID "YOUR_APP2_CLIENT_ID" // 替换为App2的客户端ID }; // 可选:如果允许同一租户内所有应用的ID Token,可关闭严格受众验证并校验issuer // options.TokenValidationParameters.ValidateAudience = false; // options.TokenValidationParameters.IssuerValidator = (issuer, token, parameters) => // { // var expectedIssuer = $"https://login.microsoftonline.com/{builder.Configuration["AzureAd:TenantId"]}/v2.0"; // return issuer == expectedIssuer ? issuer : throw new SecurityTokenInvalidIssuerException("非法颁发源"); // }; }) .AddInMemoryTokenCaches(); builder.Services.AddAuthorization(); var app = builder.Build(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
3. 多应用场景下的最佳认证方案
同一租户内的UI应用
- 推荐方案:让App2获取针对App1 API的Access Token(而非ID Token),步骤如下:
- 在App1的API注册页面,添加App2为授权客户端(在「API权限」中配置App2的访问权限)
- App2登录时,请求App1 API的自定义范围(如
api://App1-ClientId/access_as_user) - App2拿到Access Token后发送给App1 API,API通过标准JWT验证即可(无需自定义受众规则)
- 若坚持使用ID Token:参考上述代码配置允许的受众列表,同时确保仅开放给同一租户内的可信应用,避免安全风险。
外部租户/非SSO应用
- 使用客户端凭证流:第三方应用通过自身的客户端ID+密钥/证书,获取App1 API的Access Token,API验证该Token的受众和颁发源即可,无需用户参与。
关键注意事项
- 不要硬编码应用ID,建议通过配置文件管理允许的客户端列表
- 无论使用ID Token还是Access Token,
Microsoft.Identity.Web会自动通过Azure AD公钥端点获取公钥验证签名,无需手动处理私钥 - 生产环境中,尽量避免关闭
ValidateAudience,优先采用明确指定允许受众的方式,最小化攻击面
内容的提问来源于stack exchange,提问作者Sandeep C
相关产品推荐
相关产品推荐

