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

基于OAuth/OWIN/ASP.NET Identity的多站点无第三方SSO授权咨询

无需第三方服务商实现同技术栈下的单点登录(SSO)

完全可以基于你现有的OAuth bearer token、OWIN及ASP.NET Identity技术栈实现SSO,不用依赖Auth0这类第三方服务商。下面分两种场景给出具体实现方案:

方案一:共享ASP.NET Identity Cookie(适合同域/子域场景)

如果两个Web应用属于同一主域名下的子域(比如app1.yourdomain.com和app2.yourdomain.com),或者完全同域,这种方案最简单:

  1. 共享用户数据库:确保两个应用的连接字符串指向同一个ASP.NET Identity数据库,保证用户身份数据一致。
  2. 统一Cookie认证配置:在两个应用的OWIN Startup配置中,使用完全相同的Cookie名称、加密密钥和认证类型:
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        CookieName = ".AspNet.ApplicationCookie", // 两个应用必须一致
        CookieDomain = ".yourdomain.com", // 子域场景下设置主域名,同域可省略
        TicketDataFormat = new TicketDataFormat(
            new MachineKeyProtector(
                typeof(CookieAuthenticationMiddleware).Namespace,
                DefaultAuthenticationTypes.ApplicationCookie,
                DefaultAuthenticationTypes.ApplicationCookie
            )
        ),
        LoginPath = new PathString("/Account/Login")
    });
    
    另外,需要在两个应用的web.config中配置相同的<machineKey>,确保Cookie加密解密逻辑一致:
    <system.web>
        <machineKey validationKey="YOUR_SHARED_VALIDATION_KEY" 
                    decryptionKey="YOUR_SHARED_DECRYPTION_KEY" 
                    validation="HMACSHA256" decryption="AES" />
    </system.web>
    
  3. 效果:用户在一个应用登录后,浏览器会自动将共享Cookie发送到另一个同/子域应用,OWIN验证Cookie有效性后,自动完成用户登录。

方案二:自定义OAuth 2.0授权服务器(适合跨域场景)

如果两个应用属于不同域名,推荐基于现有OAuth bearer token实现自定义授权服务器方案:

  1. 选定授权服务器:将其中一个应用作为授权中心,负责处理用户登录和Token发放;另一个应用作为客户端。
  2. 配置授权服务器:在授权服务器的OWIN Startup中添加OAuth授权服务,复用ASP.NET Identity做用户验证:
    app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
    {
        AllowInsecureHttp = false, // 生产环境强制HTTPS
        TokenEndpointPath = new PathString("/Token"),
        AuthorizeEndpointPath = new PathString("/Account/Authorize"),
        AccessTokenExpireTimeSpan = TimeSpan.FromHours(1),
        Provider = new CustomOAuthProvider(), // 自定义Provider,调用ASP.NET Identity验证用户
        AccessTokenFormat = new TicketDataFormat(new MachineKeyProtector()) // 与客户端共享加密密钥
    });
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
    
    其中CustomOAuthProvider需要实现IOAuthAuthorizationServerProvider,在GrantResourceOwnerCredentials方法中调用ASP.NET Identity的UserManager验证用户名密码。
  3. 配置客户端应用:客户端应用通过OWIN配置Bearer Token验证,并对接授权服务器的授权流程:
    app.UseCookieAuthentication(new CookieAuthenticationOptions());
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
    {
        AuthenticationType = "Bearer",
        AuthenticationMode = AuthenticationMode.Passive,
        TokenValidationParameters = new TokenValidationParameters
        {
            ValidIssuer = "https://auth.yourdomain.com", // 授权服务器地址
            ValidAudience = "client_app_001", // 预先约定的客户端ID
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("YOUR_SHARED_SECRET")) // 与授权服务器共享的密钥
        }
    });
    
  4. 登录流程:客户端应用跳转到授权服务器的登录页,用户登录后授权服务器返回授权码,客户端用授权码换取AccessToken,再通过Token获取用户信息,最终创建本地登录Cookie,实现自动登录。

Angular前端适配

  • Cookie共享场景:Angular发送请求时需开启withCredentials,确保浏览器携带共享Cookie:
    this.http.get('/api/user', { withCredentials: true }).subscribe(user => {
        // 处理用户登录状态
    });
    
  • 自定义授权服务器场景:可以使用angular-oauth2-oidc库简化授权码流程,配置授权服务器地址、客户端ID等参数,自动处理跳转、Token获取和存储逻辑。

关键注意事项

  • 所有应用必须使用HTTPS,防止Token或Cookie被拦截窃取
  • 共享的加密密钥、客户端密钥等敏感信息,不要硬编码,应通过配置文件或密钥管理服务存储
  • 跨域场景下,授权服务器需配置CORS,允许客户端应用访问授权和Token端点
  • ASP.NET Identity的用户表必须在两个应用间共享,确保用户身份数据一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:55:07