ASP.Net Identity集成SAML IdP并保留本地IdentityUser对象方案咨询
方案可行性与推荐度
该方案完全可行,是现有ASP.NET Identity体系对接企业级IdP的主流实践,非常推荐:既满足了身份认证统一纳管的需求,又能最大化复用原有业务逻辑,不需要改造现有基于Identity的权限、用户关联业务代码。
具体实现步骤
- 保留原有ASP.NET Identity的全部配置:包括
IdentityDbContext、本地SQL用户/角色/自定义用户字段表结构、UserManager/SignInManager的服务注入,原有本地存储的用户数据不需要做任何修改 - 引入对应.NET版本的SAML认证中间件:
- 若为.NET Framework MVC应用,使用官方
Microsoft.Owin.Security.Saml包 - 若为.NET Core/.NET 6+ MVC应用,使用
ITfoxtec.Identity.Saml2社区成熟包
- 若为.NET Framework MVC应用,使用官方
- 调整认证配置:禁用原有Identity的用户名密码认证入口,将SAML方案设为默认的挑战认证方案,同时保留Identity的Cookie认证作为本地会话的身份载体
- 自定义SAML认证成功回调逻辑,这是最核心的步骤:
回调中首先从SAML响应的断言中提取唯一用户标识(你预期的邮箱字段,或IdP约定的其他唯一字段如工号),调用原有
UserManager.FindByEmailAsync()或自定义查询方法,从本地SQL数据库拉取完整的IdentityUser对象、关联角色、自定义扩展字段数据。
将本地读取到的用户ID、用户名、角色、所有业务需要的自定义字段转换为Claims,写入Identity的认证Cookie。 - 后续业务层可以完全复用原有基于
IdentityUser、UserManager、[Authorize(Roles = "xxx")]特性的逻辑,不需要做任何适配改造。
关键注意事项
- 做好本地用户匹配的异常处理:如果IdP返回的标识在本地数据库不存在,可根据业务规则选择直接拒绝访问,或是触发自动创建本地用户的流程,填充默认角色和属性
- 原有Identity存储的密码哈希字段可以保留不需要清空,后续如果需要回滚到本地账号密码认证,不需要做数据恢复
- 必须严格开启SAML响应的签名校验、断言过期校验,不要为了调试方便关闭相关安全配置
- 角色授权逻辑完全可以复用原有本地Identity的实现,不需要同步IdP侧的角色断言,除非你后续有将角色也统一放到IdP管理的需求
内容的提问来源于stack exchange,提问作者user7273434
相关产品推荐
相关产品推荐

