可否在不使用ASP.NET Cookie身份验证的情况下使用Sustainsys.SAML2
Sustainsys SAML2 OWIN版本适配方案解答
完全可以脱离ASP.NET自带的Cookie身份验证模块使用Sustainsys.Saml2的OWIN版本,你的选型方向是合理的。
选型合理性验证
- 你选择OWIN版本的判断完全正确:MVC版本的Sustainsys.Saml2采用全局静态配置,确实不支持多租户场景下按请求(比如按域名、租户标识)动态加载IdP配置,OWIN版本支持基于请求上下文动态生成配置,完美匹配多租户需求。
- 单MVC入口加载Angular SPA的架构也完全适配:SAML的断言消费(ACS)、单点登出等端点都可以由OWIN中间件直接处理,不需要额外编写MVC控制器逻辑,处理完SAML响应后直接跳转回你的SPA前端即可。
脱离ASP.NET Cookie认证的实现方案
Sustainsys.Saml2和ASP.NET Cookie认证的绑定只是默认配置的简化逻辑,你完全可以通过自定义AcsCommandResult的处理逻辑跳过这个绑定:
- 配置Sustainsys.Saml2中间件时,不要配置默认的
SignInAsAuthenticationType属性,这个属性是用来关联Cookie认证模块的,不填写就不会触发默认的Cookie写入逻辑。 - 注册Saml2通知的
AcsCommandResultCreated回调即可接管整个认证流程,示例代码如下:
var saml2Options = new Saml2AuthenticationOptions(false) { // 可自行实现多租户配置逻辑,按当前请求的租户标识加载对应IdP配置 Notifications = new Saml2Notifications { AcsCommandResultCreated = (commandResult, response) => { // 此处可直接获取SAML响应解析后的所有声明信息:response.Claims // 直接调用你自身的自定义身份验证逻辑,生成自研体系的身份票据、会话标识即可 // 处理完自定义认证逻辑后,重写跳转地址到你的SPA入口或者登录后目标页 commandResult.RedirectUrl = "/你的SPA入口路径"; // 清空默认的登录身份集合,避免触发官方默认的认证模块登录逻辑 commandResult.SignInIdentities.Clear(); } } }; app.UseSaml2Authentication(saml2Options);
额外注意事项
- 多租户场景下你可以实现自定义的
IIndexedEntityStore,按当前请求的租户标识返回对应的SP配置、IdP配置,不需要使用全局固定配置。 - 所有SAML相关端点(比如/acs、/logout)都由OWIN中间件处理,你不需要在MVC路由里额外排除这些路径,OWIN中间件优先级高于MVC路由。
- 如果你不需要用到库自带的单点登出功能,可以直接忽略相关配置项,只保留断言消费逻辑即可。
内容的提问来源于stack exchange,提问作者Björn
相关产品推荐
相关产品推荐

