.net 核心 API 中的混合身份验证
Posted
技术标签:
【中文标题】.net 核心 API 中的混合身份验证【英文标题】:Mixed Authentication in .net core API 【发布时间】:2020-06-11 19:44:55 【问题描述】:我正在构建一个多租户 Service Fabric 应用程序,它允许租户指定登录类型 - Identity(asp.net)/Azure AD。
我有一个身份验证服务,它检查用户链接到哪个租户,然后继续检查用户的用户名:密码是否有效,如果有效,它会向网关 API/Web API 返回一个 JWT 令牌,然后允许访问集群上的其余服务。
这由角色进一步保护以限制操作和数据访问等。
问题 1 如果租户使用 azure AD,那么保存该租户提供的应用程序 ID 和密码的安全方法是什么? 在我的数据库中并加密信息,它必须被解密才能连接到 AD(试图保持动态)。
问题 2 我正在实现自己的滑动刷新令牌以在过期后获取新的 JWT,是否有更好/标准的方法?
问题 3 是否有更好/标准的方法来处理这个多租户登录过程。
问题 4 有没有办法在 JWT 主题上设置可选声明,允许访问共享服务,但如果声明值不正确,则阻止访问租户特定服务?
编辑 理想情况下,角色不应成为租户 AD/B2C 的一部分,因为它们的角色是动态的,并且在应用程序内进行管理。
【问题讨论】:
【参考方案1】:不要构建您自己的 STS 逻辑,而是看看 IdentityServer,这是一个流行且出色的 OSS 工具。
例如,查看here 以获取使用 asp.net 核心的多租户示例。
它支持通过实现Profile Service 向令牌添加自定义声明。可以将服务配置为使用 authorization 的声明。
This blog post 也可能有用。
【讨论】:
感谢 LoekD,如果这有帮助,我会看看并投票。正如我查看过 identityServer 但无法完全理解它,因为 JWT 总是由我的身份验证服务生成,而不是由 AZure AD 或 asp.net Identity 生成【参考方案2】:我强烈建议您使用 Azure 租户模型,让 Azure AD 管理所有凭据和身份验证。在当今世界,当有大量可用的身份提供者时,存储和管理用户凭据是一个非常糟糕的主意。
推荐阅读:
-
How to build a multi-tenant app with Azure AD
如何secure a Web API with Azure AD。
像 MSAL.NET 这样的库会自动manage token caches and refreshes。
在 Azure AD 中使用 roles and groups
在一定程度上对can be customized 发行的代币进行索赔。
免责声明:我为微软工作
【讨论】:
我遇到的问题是,用户管理然后落入应用程序的主机而不是租户,如果我错了,请纠正我,但如果租户(组织)没有Azure AD 帐户,我将为他们创建一个 B2C,而这又需要主机来管理? 此外,在角色方面,在存在静态系统角色和每个租户的动态角色的场景中,是否也需要由 AD 管理? 因此,ISV 为尚未拥有 Azure AD 租户的客户管理租户是很常见的。这是一件复杂而令人沮丧的事情,但差距正在缩小,希望在不久的将来不再是问题。您可以使用 B2C,但 B2C 仍然不支持角色,因此在您的规划中考虑这一事实。 Azure AD 中没有“动态角色”之类的东西。我认为您指的是“动态组”。组和角色在 Azure AD 中是非常不同的东西,请参考这个稍微过时的recorded session 了解 在我的范围内,角色将与内置身份角色在同一行,然后将其构建到声明中以确定用户是否有权访问资源。 请完成我推荐的课程。角色在different Microsoft 产品中具有不同的含义。我建议你把它们都钓一次:)以上是关于.net 核心 API 中的混合身份验证的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET 核心 Web API 和 Angular 客户端中的外部身份验证
具有混合身份验证 JWT 和 SAML 的 ASP.NET Web API 2.2 OWIN
ASP.NET Core 中的混合身份验证(Windows 和 AAD JwtBearer)
使用 .net 核心 Web API 对 .net 控制台应用程序进行身份验证
从 API 身份验证返回的 Azure Blob SAS 网址失败 .net 核心
text 使用ASP.NET Core 2 Web API,Angular 5,.NET核心身份和Facebook登录进行JWT身份验证