代码之家  ›  专栏  ›  技术社区  ›  BlakeH

基于声明的授权是否适用于单个资源

  •  1
  • BlakeH  · 技术社区  · 7 年前

    想象一下一个wiki应用程序。你可能有一个 内容贡献者 声明允许用户添加内容 声明允许用户删除内容,以及

    再举一个例子,我可能想限制用户,使他们只能看到他们自己或他们的团队创建的内容。

    如果用户只能看到自己创建的内容,我们会对他们创建的每一项内容提出索赔,还是将授权委托给应用程序?

    1 回复  |  直到 6 年前
        1
  •  18
  •   Ruard van Elburg    7 年前

    那你说的是 授权 .

    索赔通常是 对于 授权 用户名称: 是用户吗?索赔本身并没有说明任何关于授权的内容。用户可以拥有角色声明,但这并不能告诉应用程序 什么 允许用户这样做。

    授权是由应用程序根据用户的身份进行的。把授权看作 一套规则 ,例如:

    • :当用户年龄大于18岁时允许( ).

    • :当用户有驾照时允许。

    this article 一些背景资料。

    IMO的问题是,这些角色并不普遍。我可以成为一个 医生 病人 在另一个地方。我也可以 行政 用户

    因此,经验法则是:让授权靠近资源(api/网站)。因为那是实现业务规则的地方。在这里你可以存储和更新权限等。

    当涉及到身份验证和授权时,保持关注点的分离。身份验证告诉您用户是谁,授权告诉您允许用户做什么。别把这两个混在一起。


    将其转换为wiki应用程序:

    创建一个单独的上下文,在其中存储角色和权限等授权信息。您可以在一个中心资源(对于多个应用程序)中管理它,也可以在应用程序中使用上下文。我不会把这种情况和 业务背景 .

    在授权上下文中添加用户并添加角色 . 在应用程序中读取该用户的权限(从中央API、本地授权上下文、设置文件或任何最适合的内容)(基于 索赔)。缓存它以提高性能,并应用规则来确定是否允许用户访问资源。

    resource-based authorization . 保存 附属的 附属的

    您可以对团队使用相同的方法。添加 团队 业务背景 并将用户链接到一个或多个团队。直接使用 也可以在用户链接到 附属的

    你可以保存 和/或 声明内容记录中的值(所有者与当前用户是同一团队的成员),以确定用户允许的访问权限。


    我的设置如下:

    身份上下文 :用户+用户声明。仅用于身份验证。独立于应用程序。

    授权上下文

    业务背景 :users(Id,Name,'foreign key'子声明,没有实际的数据库关系,因为表在上下文之外)+链接到 省略用户表时的声明值。

    为了使业务上下文中的users表保持最新,请定期刷新值。例如,您可以在用户在x时间之后登录时更新值。或者偶尔查询标识上下文(使用API)以请求用户信息(使用标识用户信息端点)。

    在任何情况下都可能有 用户

    授权发生在应用程序内部,并基于业务规则(策略)和来自授权上下文的授权信息。

    User.IsInRole() [Authorize("role")]