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

ASP.NET Core多租户登录:为不同子域配置独立认证Cookie

多租户子域独立认证Cookie实现方案(ASP.NET Core Identity)

针对你需要为每个子域配置独立认证Cookie的需求,以下是最简洁可靠的实现方案,基于Identity自带的事件机制完成动态配置,避免复杂的中间件或自定义方案。

核心思路

利用CookieAuthenticationEvents在请求生命周期的关键节点(登录、验证身份、登出)动态设置Cookie名称,同时固定Cookie域为.mydomain.com,确保子域间的Cookie隔离但根域可识别。

具体实现代码

1. 基础配置(Startup.cs / Program.cs)

首先确保注册HttpContextAccessor(虽然事件上下文已自带HttpContext,可省略,但确保依赖链完整):

services.AddHttpContextAccessor();

2. 配置ApplicationCookie动态选项

覆盖Identity默认的ApplicationCookie配置,通过事件动态设置Cookie名称:

services.ConfigureApplicationCookie(options =>
{
    // 固定Cookie根域,确保所有子域能识别
    options.Cookie.Domain = ".mydomain.com";
    options.LoginPath = "/Account/Login";
    options.LogoutPath = "/Account/Logout";

    // 登录时动态设置Cookie名称
    options.Events.OnSigningIn = context =>
    {
        var host = context.HttpContext.Request.Host.Host;
        var subdomainSegments = host.Split('.');
        // 提取子域名(如从myauth1.mydomain.com得到myauth1)
        string cookieName = subdomainSegments.Length >= 3 
            ? $"AuthCookie_{subdomainSegments[0]}" 
            : "AuthCookie_Default";
        
        context.Properties.Cookie.Name = cookieName;
        return Task.CompletedTask;
    };

    // 验证身份时确保读取对应子域的Cookie
    options.Events.OnValidatePrincipal = context =>
    {
        var host = context.HttpContext.Request.Host.Host;
        var subdomainSegments = host.Split('.');
        string cookieName = subdomainSegments.Length >= 3 
            ? $"AuthCookie_{subdomainSegments[0]}" 
            : "AuthCookie_Default";
        
        context.Options.Cookie.Name = cookieName;
        return Task.CompletedTask;
    };

    // 登出时删除对应子域的Cookie
    options.Events.OnSigningOut = context =>
    {
        var host = context.HttpContext.Request.Host.Host;
        var subdomainSegments = host.Split('.');
        string cookieName = subdomainSegments.Length >= 3 
            ? $"AuthCookie_{subdomainSegments[0]}" 
            : "AuthCookie_Default";
        
        context.HttpContext.Response.Cookies.Delete(cookieName, new CookieOptions
        {
            Domain = ".mydomain.com"
        });
        return Task.CompletedTask;
    };
});

为什么之前的尝试不生效?

你之前直接修改IOptions<CookieAuthenticationOptions>的Value存在两个问题:

  • IOptions<T>是全局单例配置,修改后会影响所有请求,无法实现子域隔离;
  • 认证中间件在启动阶段已读取配置,后续中间件中修改的配置不会被已初始化的认证逻辑加载。

方案取舍说明

  • 自定义认证方案:仅适用于需要复杂租户认证逻辑的场景,对于仅隔离Cookie名称的需求过于冗余;
  • 中间件重命名Cookie:需要拦截响应头修改Cookie信息,复杂度高且容易出现边缘问题(如Cookie过期时间同步),不如Identity自带事件机制可靠。

内容的提问来源于stack exchange,提问作者Philip Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:34:53