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

能否将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:13:33