【问题标题】:Configuring User Authorization in Client Applications在客户端应用程序中配置用户授权
【发布时间】:2018-05-28 10:57:37
【问题描述】:

背景说明

谈到 Identity Server 4,当我想到客户端应用程序中的用户管理设计时,我遇到了障碍。

此时,我已经使用 ASP 身份用户帐户作为其用户存储设置了身份服务器。

我已经构建了用于将用户添加到 Identity Server 用户存储的 UI。

我已经测试了设置一个 MVC 应用程序的客户端,并且我可以成功地通过 Identity Server 进行身份验证并在我的客户端应用程序中接收 openid 身份令牌。

Identity Server 正在为我的客户端应用程序提供身份验证。

现在,我需要专注于我的应用程序中的授权。这就是我卡住的地方,我需要在应用程序本地创建用户,存储应用程序内的用户权限。

我需要将 Identity Server 中的用户链接/关联到客户端应用程序中的用户。

执行此操作的一种方法是将子存储在身份令牌中作为客户端应用程序数据库(Asp Identity)中的用户声明。这样,当用户进行身份验证时,我可以根据令牌中的 sub 在本地数据库中找到它们。

sub 必须是身份服务器用户存储中用户的唯一 ID。这样,如果用户的邮箱发生变化,我们仍然可以将两个用户帐号关联起来。

客户端应用程序中的用户帐户不需要密码或电子邮件地址,它只是用于在整个应用程序中进行授权的声明和角色,以及任何其他应用程序特定信息。

问题

在客户端应用程序中创建用户时,必须存在 Identity Server 和客户端应用程序之间的通信吗?

  • 我们需要关联这两个帐户吗?
  • 我们需要确保正在创建的客户端用户帐户也有一个身份服务器用户帐户才能成功进行身份验证?

这些任务应该在什么时候完成?我正在寻找有关两个应用程序之间通信流程的一些指导?

编辑

客户端应用程序中根本没有用户帐户是否可行?

我的意思是用户的所有用户声明都存储在 Identity Server 的用户存储中。

当客户端通过 IDP 进行身份验证时,它仅请求特定于客户端应用程序的用户声明。

用户存储中的用户声明示例:-

  1. “clientA_role”:“管理员”
  2. “clientB_role”:“用户”

客户端应用程序 A 进行身份验证时,它仅请求范围 clientA_role

这感觉很糟糕!

有什么建议吗?

【问题讨论】:

  • Derek,你找到做应用授权逻辑的好方法了吗?

标签: asp.net-mvc openid openid-connect identityserver4


【解决方案1】:

如果您有很多客户端应用程序,那么我推荐的用户管理方式是:

用户管理服务:

为用户管理创建一个单独的服务,身份服务器将用作用户存储,应用程序将在需要用户元数据时用作用户存储库。

还有你为什么要这样做:

用户存储中的用户声明示例:-

“clientA_role”:“管理员”

“clientB_role”:“用户”

为什么不 只是“角色”:“用户”?在您的应用程序中,您将使用 Authorize[Role] 注释保护您的资源。

不要为不同的应用程序创建不同的字段,将其视为一般的用户管理服务,我很确定标准化您的身份管理将使其更容易,并为您带来可维护性和灵活性。

IdentityServer 服务处理身份管理:

如果您认为您的应用程序没有如此深入的用户管理需求,将用户存储保留在提供授权的同一服务中可能是个好主意。

在这种情况下,再次存储标准声明并在 id_token 或访问令牌中返回您需要的声明。

更新:

对于在不同应用程序中具有不同角色的特定用户:

假设我们有以下内容:

1- User1 在第一个应用中具有用户角色,在第二个应用中具有管理员角色,然后

User1.Roles{"FirstAppUser","SecondAppAdmin"}

2- User2 在两个应用程序中都具有管理员角色,则:

User2.Roles{"FirstAppAdmin","SecondAppAdmin"}

【讨论】:

  • 用户可能是一个客户端应用程序的管理员,而另一个客户端应用程序的管理员。因此,在多个应用程序中拥有角色声明是不够的。我见过很多在许多基本场景中使用 Identity Server 的例子。但是一个用户,可以使用一个身份访问多个客户端应用程序,我没有。
  • 在这种情况下,使用名为 superAdministrator 或 application1Admin 和 application2Admin 的角色,如果您对两个应用程序使用相同的角色名称并且用户获取应用程序 1 的管理员角色的令牌,您如何处理阻止他从访问应用程序 2?
  • 抱歉,我的意思是,作为一个应用程序的管理员,另一个应用程序的用户。
  • 在这种情况下,您会将第一个应用程序的访问权限限制为“admin”和第二个应用程序中的“user”
  • 通过使用两个不同的声明?
猜你喜欢
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 2012-11-11
  • 1970-01-01
  • 2018-05-13
  • 2016-10-22
  • 1970-01-01
相关资源
最近更新 更多