Azure跨租户SCIM令牌验证异常:非目标租户可正常连接
Azure SCIM 令牌跨租户验证通过的问题排查与修复
问题核心
你遇到的问题是:为租户A生成的JWT令牌(Issuer为https://sts.windows.net/My_TenantId,Audience为租户A的应用ID),被租户B的SCIM应用用来测试连接时居然通过了验证,这不符合“令牌仅对目标租户内的应用生效”的设计预期。
可能的原因及修复步骤
令牌验证逻辑未校验租户标识
你的SCIM服务端可能只做了Audience(应用ID)和签名有效性校验,没验证Issuer对应的租户是否和服务绑定的目标租户一致。不同租户可能存在相同的应用ID(比如多租户应用注册),但Issuer里的租户ID是唯一的。
检查.NET Core Web API的JWT验证代码,确保同时严格校验Issuer和Audience,并且Issuer必须是目标租户的STS地址:services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = "https://sts.windows.net/你的目标租户ID/"; options.Audience = "d0d2ce47-8775-4a20............d0d2ce47"; // 强制验证Issuer,拒绝其他租户的令牌 options.TokenValidationParameters.ValidateIssuer = true; options.TokenValidationParameters.ValidIssuer = "https://sts.windows.net/你的目标租户ID/"; // 确保Audience严格匹配 options.TokenValidationParameters.ValidateAudience = true; options.TokenValidationParameters.ValidAudience = "d0d2ce47-8775-4a20............d0d2ce47"; });应用注册为多租户模式
如果你的SCIM应用注册是多租户类型,Azure STS会允许其他租户的服务主体获取该应用ID的令牌。这种情况下,只要Audience匹配、签名有效,默认验证就会通过。
解决办法二选一:- 将应用注册改为单租户模式(仅允许目标租户访问);
- 在验证逻辑中额外校验令牌的
tid声明(租户ID),确保它等于目标租户ID:options.Events = new JwtBearerEvents { OnTokenValidated = context => { var tenantId = context.Principal.FindFirstValue("tid"); if (tenantId != "你的目标租户ID") { context.Fail("无效租户"); } return Task.CompletedTask; } };
验证中间件配置或缓存问题
检查是否存在令牌缓存机制导致旧验证结果被复用,或者中间件配置未正确生效。确保每次请求都重新验证令牌的Issuer、Audience和租户ID。
验证修复效果
修改完成后,用其他租户的令牌测试连接,此时应返回401 Unauthorized错误;目标租户的令牌则正常通过验证,符合设计预期。
内容的提问来源于stack exchange,提问作者Ashish Naikwadi
相关产品推荐
相关产品推荐

