能否将IdentityServer与BFF部署在同一后端项目中?
关于Duende IdentityServer与BFF同项目部署的问题
可以将Duende IdentityServer与BFF部署在同一个Asp.Net Core后端项目中,核心是解决两者的端点冲突问题——你遇到的端点覆盖,是因为双方默认使用了部分相同的身份相关路由(如/login、/logout),只要通过配置区分路由即可解决。
解决端点冲突的具体配置方案
1. 给IdentityServer添加路由前缀
通过为IdentityServer的所有端点设置统一前缀,让它的路由和BFF的路由彻底分开:
builder.Services.AddIdentityServer(options => { // 配置IdentityServer基础选项 options.IssuerUri = "https://your-domain.com"; options.Authentication.CookieName = "idsrv.auth"; // 关键:给所有IdentityServer端点添加前缀,比如/identity options.Endpoints.MapRoutes("/identity"); }) // 后续添加AspNetIdentity、配置存储等逻辑不变 .AddAspNetIdentity<ApplicationUser>() .AddConfigurationStore(options => { options.ConfigureDbContext = b => b.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")); }) .AddOperationalStore(options => { options.ConfigureDbContext = b => b.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")); });
配置后,IdentityServer的登录、登出等端点会变成/identity/login、/identity/logout,不会再和BFF的默认端点冲突。
2. 配置BFF的独立身份端点
调整BFF的登录、回调等路径,同时让BFF的认证指向带前缀的IdentityServer:
// 配置BFF服务 builder.Services.AddBff(options => { // 自定义BFF的身份端点路径 options.LoginPath = "/bff/login"; options.LogoutPath = "/bff/logout"; options.ErrorPath = "/bff/error"; }) .AddRemoteApis() .AddServerSideSessions(); // 配置认证体系 builder.Services.AddAuthentication(options => { options.DefaultScheme = "BFF"; options.DefaultChallengeScheme = "oidc"; }) .AddCookie("BFF", options => { options.Cookie.Name = "bff.session"; options.Cookie.SameSite = SameSiteMode.Strict; }) .AddOpenIdConnect("oidc", options => { // 指向带前缀的IdentityServer地址 options.Authority = "https://your-domain.com/identity"; options.ClientId = "your-bff-client-id"; options.ClientSecret = "your-bff-client-secret"; options.ResponseType = "code"; // 按需添加所需Scope options.Scope.Add("openid"); options.Scope.Add("profile"); options.Scope.Add("your-api-scope"); // BFF模式下不需要在客户端保存令牌 options.SaveTokens = false; options.GetClaimsFromUserInfoEndpoint = true; // 配置BFF的回调路径 options.CallbackPath = "/bff/callback"; options.SignedOutCallbackPath = "/bff/signedout"; });
3. 注意端点挂载顺序
在Program.cs的中间件管道中,要先挂载IdentityServer的端点,再挂载BFF的相关端点,确保路由匹配逻辑正确:
app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 先挂载IdentityServer app.UseIdentityServer(); // 再挂载BFF中间件 app.UseBff(); app.UseAuthentication(); app.UseAuthorization(); // 映射BFF的管理端点 app.MapBffManagementEndpoints(); // 映射你的API或Blazor Server/预渲染页面路由 app.MapControllers(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host");
同项目部署的优缺点
- 优点:部署成本低,无需维护多个独立服务,适合中小型项目,减少跨服务认证的复杂度。
- 缺点:职责耦合度高,后续若项目规模扩大,拆分服务会有一定成本;IdentityServer和BFF的配置、版本更新可能互相影响。
内容的提问来源于stack exchange,提问作者Michael Kanios
相关产品推荐
相关产品推荐

