基于声明的身份验证和用户圈子

Posted

技术标签:

【中文标题】基于声明的身份验证和用户圈子【英文标题】:Claims-based auth and circles of users 【发布时间】:2016-01-10 08:36:18 【问题描述】:

让我们考虑一个简单的基于 REST 的 Web 服务来存储和检索 JSON 对象。无需任何身份验证,每个用户都可以访问任何数据。

现在让我们添加使用 JWT 来对用户进行身份验证。当然,由于我们没有进行授权,仍然每个用户都可以访问任何东西,但至少现在我们知道谁访问了什么。

下一步:存储对象时,将用户的sub声明与该对象一起保存,并验证用户的sub声明是否与请求的对象匹配,如果匹配,则交付。现在我们拥有基于每个用户的授权。到目前为止,很容易。

现在让我们添加让用户与其他用户共享对象的可能性。例如,为了简单起见,我们希望有预定义的组(即角色),并且我们想让用户选择哪个组(角色)可以访问他们创建的对象。这仍然很容易,因为您有一个预定义的组列表,因此您可以让用户选择一个或多个,并将它们附加到对象上。此外,身份提供者需要配置为将groups 声明放入每个用户的令牌中,以便我们可以匹配它们。从本段的长度我们已经可以看出,事情变得更加复杂。

问题 1:到目前为止,我是否正确,以这种方式处理“静态”组是否可行?

现在,让我们让用户有机会自己创建组。这仍然不复杂,但是我们如何让身份提供者使用动态创建的组呢?当然,我们不想让管理员每天更新身份提供者的配置;-)。

问题 2:我们如何处理动态创建的组?

现在,最后,让我们忘记组,假设我们希望允许用户能够简单地与其他用户共享他们的对象。这应该可以为每个对象单独配置。我们如何做到这一点?我们是否在对象上保存了用户列表?如果是这样,我们究竟要保存什么? sub 声明?如果是这样,所有者用户如何知道适当的值?还是……?

并且:假设用户想要将他们的朋友动态放入动态生成的圈子中,我们该怎么做?

问题 3:令牌和具有动态分配用户的动态创建组如何相互协作?

【问题讨论】:

【参考方案1】:

在我看来,令牌应该只包含身份信息(-claims),您需要在资源服务器上识别用户,或者刷新时不会更改,因为您不希望您的用户(或您的应用程序)地方)必须在每次他的权限更改时刷新他的访问令牌(因为访问令牌在特定时间内授予访问权限,您不希望您的用户访问某些资源,因为他失去了访问权限通过不刷新令牌并简单地使用旧令牌来刷新最后一个令牌)。您附加到令牌的安全相关信息越多,您可能添加到系统中的漏洞就越多(取决于您的令牌生命周期)。

这样说,我会(并且总是这样做)通过资源服务器上的用户 ID(包含在 jwt-token 中)来识别用户角色或组。为了实现这一点,我总是将用户身份信息附加到资源服务器上的当前请求,并将用户角色或组等“动态”声明附加到身份。

通过仅添加我需要在资源服务器上识别用户和用户权限的身份信息,我倾向于跨多个应用程序使用我的身份提供程序,而不处理身份提供程序上的应用程序范围,因此我可以使用完全相同的多个独立资源服务器的访问令牌。

【讨论】:

以上是关于基于声明的身份验证和用户圈子的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助了解 ASP .Net MVC 用户身份验证/授权

用户和单独模块的基于令牌的身份验证

使用机器对机器和基于用户的身份验证使用 JWT 进行嵌套身份验证和授权是一回事吗?

ASP .NET CORE 2.2 JWT 和声明网站的身份验证

SharePoint 2010 自定义 WCF 服务 - Windows 和 FBA 身份验证

从基于 Sharepoint 声明的身份验证 Web 应用程序中的代码访问 Windows 共享