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. 验证效果
- 先启动SSO、Client_1、Client_2三个项目,全部用HTTPS地址访问
- 访问Client_1的受保护页面,自动跳转SSO登录页,输入账号密码完成登录,回跳Client_1
- 新开标签页访问Client_2的受保护页面,会自动跳转SSO后立刻回跳Client_2,无需再次登录,即完成SSO会话共享
注意事项
- 开发环境需要信任ASP.NET Core的自签名证书,否则HTTPS访问会报错导致Cookie传递失败
- 生产环境部署时如果SSO和客户端不在同一个根域名下,只需保持上述配置不变即可正常工作,IdentityServer本身支持跨根域名的SSO能力
内容的提问来源于stack exchange,提问作者nima ansari
相关产品推荐
相关产品推荐

