使用外部身份验证提供程序获取用户凭据,使用私有 IdentityServer 生成令牌
Use of external authentication provider for user credentials, private IdentityServer for token generation
我正在设计一个安全后端,它应该为多个客户端提供令牌以保护多个 API。用户数据库在 Azure B2C https://azure.microsoft.com/en-us/services/active-directory-b2c/ 中。
我想创建 API 令牌,其中包含基于用户访问权限的不同声明。例如:用户 A 应该能够调用 /api/stores/11,但不能调用 /api/stores/12。
用例:
- 直接进入 Azure B2C 以进行用户登录和令牌生成的应用程序 (ipad)。使用此令牌调用 APIs 进行用户个人资料社交互动等
- 将调用具有访问权限限制的相同 APIs(不同模块)的外部系统。外部系统将拥有管理员,他们还将从 Azure B2C 获取凭据。
目前我的解决方案:
- IdentityServer4 (https://github.com/IdentityServer/IdentityServer4) 调用 Azure B2C 登录以验证用户凭据。
- 一旦身份验证完成(回调),IdentityServer 将应用用户对外部系统拥有的任何声明(访问权限等),然后生成令牌。 IdentityServer 将有一个连接 userid/emails 并具有访问权限的本地数据库。
- APIs 将使用多租户身份验证提供程序来支持来自 Azure B2C 和我的 "in-between" IdentityServer 的令牌。提供商分别是 IdentityServerAuthentication 和 OpenIdConnectAuthentication。
我的问题是这是否是一个可行的解决方案?是不是太复杂了?在这种情况下你会做些什么不同的事情?我不想实现第二次用户登录,而且 Azure B2C 似乎不支持细粒度访问权限。
提前谢谢你。
这对于 IdentityServer4 来说非常可行。您的用例可以得到满足。我建议查看 samples.
这其实是一个很常见的架构。
核心身份和令牌平台由你拥有——这是唯一明智的做法。
然后您可以使用任何机制(在您的情况下为 Azure B2C)进行身份验证。您可能希望在将来添加一个本地数据库,其中包含用户或其他一些身份验证机制。这完全没问题。
重要的一点是——您的应用程序不关心这些。他们只知道您的平台(在您的情况下使用身份服务器构建)。如果您决定有一天您需要更改您的身份验证提供程序 - 没关系。您的应用程序不受这一事实的影响。
此时,您的应用程序和服务只需要信任来自 identityserver 的令牌 - identityserver 负责与外部各方建立信任关系。
我正在设计一个安全后端,它应该为多个客户端提供令牌以保护多个 API。用户数据库在 Azure B2C https://azure.microsoft.com/en-us/services/active-directory-b2c/ 中。 我想创建 API 令牌,其中包含基于用户访问权限的不同声明。例如:用户 A 应该能够调用 /api/stores/11,但不能调用 /api/stores/12。
用例:
- 直接进入 Azure B2C 以进行用户登录和令牌生成的应用程序 (ipad)。使用此令牌调用 APIs 进行用户个人资料社交互动等
- 将调用具有访问权限限制的相同 APIs(不同模块)的外部系统。外部系统将拥有管理员,他们还将从 Azure B2C 获取凭据。
目前我的解决方案:
- IdentityServer4 (https://github.com/IdentityServer/IdentityServer4) 调用 Azure B2C 登录以验证用户凭据。
- 一旦身份验证完成(回调),IdentityServer 将应用用户对外部系统拥有的任何声明(访问权限等),然后生成令牌。 IdentityServer 将有一个连接 userid/emails 并具有访问权限的本地数据库。
- APIs 将使用多租户身份验证提供程序来支持来自 Azure B2C 和我的 "in-between" IdentityServer 的令牌。提供商分别是 IdentityServerAuthentication 和 OpenIdConnectAuthentication。
我的问题是这是否是一个可行的解决方案?是不是太复杂了?在这种情况下你会做些什么不同的事情?我不想实现第二次用户登录,而且 Azure B2C 似乎不支持细粒度访问权限。
提前谢谢你。
这对于 IdentityServer4 来说非常可行。您的用例可以得到满足。我建议查看 samples.
这其实是一个很常见的架构。
核心身份和令牌平台由你拥有——这是唯一明智的做法。
然后您可以使用任何机制(在您的情况下为 Azure B2C)进行身份验证。您可能希望在将来添加一个本地数据库,其中包含用户或其他一些身份验证机制。这完全没问题。
重要的一点是——您的应用程序不关心这些。他们只知道您的平台(在您的情况下使用身份服务器构建)。如果您决定有一天您需要更改您的身份验证提供程序 - 没关系。您的应用程序不受这一事实的影响。
此时,您的应用程序和服务只需要信任来自 identityserver 的令牌 - identityserver 负责与外部各方建立信任关系。