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

ASP.NET 5环境下IdentityServer4多客户端共享认证Cookie如何实现

实现逻辑说明

首先你理解的「认证Cookie共享」实际是共享SSO认证中心的登录会话,而非两个客户端直接互相同步Cookie:两个客户端端口不同,浏览器会隔离各自域名下的Cookie,正确的SSO流程是用户登录过SSO后,访问第二个客户端时,客户端跳转SSO认证中心,SSO读到自身已有的登录Cookie,直接返回认证凭证给第二个客户端,全程无需用户再次输入账号密码。

具体配置步骤

1. 调整SSO端Client配置

修改Config.cs里的两个Client配置,补全Implicit流必需的属性:

new Client()
{
    ClientId = "Client_1",
    ClientName = "SSO Application",
    AllowedGrantTypes = GrantTypes.Implicit,
    RedirectUris = {"https://localhost:44387/signin-oidc"},
    PostLogoutRedirectUris = {"https://localhost:44387/signout-callback-oidc"},
    AllowedScopes = new List<string>()
    {
        IdentityServerConstants.StandardScopes.OpenId,
        IdentityServerConstants.StandardScopes.Profile
    },
    // 新增以下2个配置
    AllowAccessTokensViaBrowser = true, // Implicit流需要允许浏览器传递令牌
    RequireConsent = false // 关闭授权确认页,可根据需求开启
},
// Client_2配置同理添加上述2个属性

2. 两个客户端新增身份认证配置

两个ASP.NET 5客户端项目的Startup.cs都需要添加OpenID Connect认证配置,以Client_1为例:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    // 新增身份认证配置
    services.AddAuthentication(options =>
    {
        options.DefaultScheme = "Cookies";
        options.DefaultChallengeScheme = "oidc";
    })
    .AddCookie("Cookies")
    .AddOpenIdConnect("oidc", options =>
    {
        options.Authority = "https://localhost:44372"; // 指向你的SSO地址
        options.ClientId = "Client_1"; // Client_2这里填Client_2
        options.ResponseType = "id_token token"; // 匹配Implicit流要求
        options.SaveTokens = true; // 保存令牌到本地Cookie
        options.GetClaimsFromUserInfoEndpoint = true; // 从SSO拉取用户信息
        options.Scope.Add("profile");
        
        // 适配HTTPS下跨端口Cookie传递要求
        options.NonceCookie.SameSite = SameSiteMode.None;
        options.CorrelationCookie.SameSite = SameSiteMode.None;
        options.NonceCookie.SecurePolicy = CookieSecurePolicy.Always;
        options.CorrelationCookie.SecurePolicy = CookieSecurePolicy.Always;
    });
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ... 其他中间件配置
    app.UseRouting();
    // 新增2个中间件,顺序不能换
    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}")
        .RequireAuthorization(); // 给所有路由加授权校验,也可以单独给Controller加[Authorize]特性
    });
}

3. 验证效果

  1. 先启动SSO、Client_1、Client_2三个项目,全部用HTTPS地址访问
  2. 访问Client_1的受保护页面,自动跳转SSO登录页,输入账号密码完成登录,回跳Client_1
  3. 新开标签页访问Client_2的受保护页面,会自动跳转SSO后立刻回跳Client_2,无需再次登录,即完成SSO会话共享

注意事项

  • 开发环境需要信任ASP.NET Core的自签名证书,否则HTTPS访问会报错导致Cookie传递失败
  • 生产环境部署时如果SSO和客户端不在同一个根域名下,只需保持上述配置不变即可正常工作,IdentityServer本身支持跨根域名的SSO能力

内容的提问来源于stack exchange,提问作者nima ansari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:57:04