基于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),或者完全同域,这种方案最简单:
- 共享用户数据库:确保两个应用的连接字符串指向同一个ASP.NET Identity数据库,保证用户身份数据一致。
- 统一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> - 效果:用户在一个应用登录后,浏览器会自动将共享Cookie发送到另一个同/子域应用,OWIN验证Cookie有效性后,自动完成用户登录。
方案二:自定义OAuth 2.0授权服务器(适合跨域场景)
如果两个应用属于不同域名,推荐基于现有OAuth bearer token实现自定义授权服务器方案:
- 选定授权服务器:将其中一个应用作为授权中心,负责处理用户登录和Token发放;另一个应用作为客户端。
- 配置授权服务器:在授权服务器的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验证用户名密码。 - 配置客户端应用:客户端应用通过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")) // 与授权服务器共享的密钥 } }); - 登录流程:客户端应用跳转到授权服务器的登录页,用户登录后授权服务器返回授权码,客户端用授权码换取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
相关产品推荐
相关产品推荐

