ASP.NET Core Blazor Server 仅允许两个指定Azure AD租户登录配置问题
正确配置多租户白名单校验方法
配置不生效原因
你当前手动配置OpenIdConnectOptions的执行时机早于AddMicrosoftIdentityWebApp内部的配置逻辑,导致你自定义的TokenValidationParameters被默认配置覆盖,所以校验规则没有生效。
方案1:直接在身份注册逻辑中配置校验规则
将原身份注册代码替换为以下内容,直接在AddMicrosoftIdentityWebApp的委托中修改验证参数,不会被默认配置覆盖:
// 先读取配置中的允许租户ID列表,生成合法issuer列表 var allowedTenantIds = Configuration["AllowedIssuers"].Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); var validIssuers = allowedTenantIds.Select(tenantId => $"https://login.microsoftonline.com/{tenantId}/v2.0").ToList(); services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(options => { // 绑定原有AzureAd配置 Configuration.Bind("AzureAd", options); // 配置签发方校验规则 options.TokenValidationParameters.ValidateIssuer = true; options.TokenValidationParameters.ValidIssuers = validIssuers; });
方案2:新增授权策略做双重校验
为了避免端点版本不一致导致的issuer校验失效,可以额外增加全局授权策略,作为第二道校验:
services.AddAuthorization(options => { options.AddPolicy("OnlyAllowedTenants", policy => { policy.RequireAssertion(context => { var userIssuer = context.User.FindFirst("iss")?.Value; return !string.IsNullOrEmpty(userIssuer) && validIssuers.Contains(userIssuer); }); }); }); // 全局应用授权策略,所有页面都需要符合规则 services.AddControllersWithViews(options => { options.Filters.Add(new AuthorizeFilter("OnlyAllowedTenants")); }); services.AddRazorPages();
注意事项
- 确保你配置的
ValidIssuers格式和用户ID Token中返回的issclaim完全一致,如果你的应用使用的是Azure AD v1授权端点,issuer格式不需要带/v2.0后缀。 - 租户ID不要填写错误,和
AllowedIssuers中配置的租户ID一一对应。
内容的提问来源于stack exchange,提问作者RannyMeier
相关产品推荐
相关产品推荐

