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

同一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),步骤如下:
    1. 在App1的API注册页面,添加App2为授权客户端(在「API权限」中配置App2的访问权限)
    2. App2登录时,请求App1 API的自定义范围(如api://App1-ClientId/access_as_user)
    3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:45:24