ABP.IO Blazor WebAssembly实现DomainTenantResolver免选租户登录
基于ABP.IO Blazor WebAssembly的免选租户登录实现方案
子域名DomainTenantResolver方案(推荐最优方案)问题修复
你之前仅添加回调地址后租户用户无法登录,核心原因是IdentityServer端未正确从域名解析租户,且认证请求未携带租户标识,按以下步骤修复即可:
- 第一步:调整服务端租户解析器优先级,在IdentityServer/API宿主服务的模块类
ConfigureServices方法中添加如下配置,保证域名解析优先级最高:
Configure<AbpTenantResolveOptions>(options => { // 开发环境配置,将localhost替换为生产环境根域名即可,格式为{0}.你的根域名 options.TenantResolvers.Insert(0, new DomainTenantResolveContributor("{0}.localhost")); });
- 第二步:替换单租户回调地址为通配符配置,无需每个租户单独插入数据库,直接在IdentityServer客户端配置的
RedirectUris、PostLogoutRedirectUris中添加通配符地址:https://*.localhost/authentication/login-callback、https://*.localhost/authentication/logout-callback,ABP原生支持通配符匹配。 - 第三步:Blazor端配置OIDC请求携带租户标识,在WebAssembly项目的
Program.cs中修改OIDC配置,跳转认证时自动传递解析到的子域名租户:
builder.Services.AddOidcAuthentication(options => { builder.Configuration.Bind("OAuth", options.ProviderOptions); options.ProviderOptions.Events = new OpenIdConnectEvents { OnRedirectToIdentityProvider = context => { var hostSegments = context.Request.Host.Host.Split('.'); if (hostSegments.Length >=3) // 匹配子域名格式 { context.ProtocolMessage.SetParameter("__tenant", hostSegments[0]); } return Task.CompletedTask; } }; });
QueryString租户传参方案问题修复
该方案参数无法传递的核心原因是默认的RemoteAuthenticatorView不会自动携带URL中的租户参数,修改你的Authenticate组件代码即可:
@page "/authentication/{action}" @using Microsoft.AspNetCore.Components.WebAssembly.Authentication @inject NavigationManager NavManager <RemoteAuthenticatorView Action="@Action" OnRedirectToStartLogin="InjectTenantParam" /> @code{ [Parameter] public string Action { get; set; } private void InjectTenantParam(RedirectContext context) { if (NavManager.TryGetQueryString<string>("__tenant", out var tenantId)) { context.Properties.Items["__tenant"] = tenantId; } } }
修改后无需调整服务端默认配置,ABP默认已启用QueryStringTenantResolveContributor,可自动识别请求中的__tenant参数。
内容的提问来源于stack exchange,提问作者dlboutwe
相关产品推荐
相关产品推荐

