在客户端应用程序中配置用户授权

Der*_*rek 6 openid asp.net-mvc openid-connect identityserver4

背景说明

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

此时,我使用ASP身份用户帐户作为其用户存储设置Identity Server.

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

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

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

现在,我需要专注于我的应用程序内的授权.这就是我遇到困难的地方,我需要在应用程序本地创建用户,其中存储了应用程序中的用户权限.

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

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

sub必须是身份服务器用户存储中用户的唯一ID.这样,如果用户的电子邮件被更改,我们仍然可以链接这两个用户帐户.

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

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

  • 我们需要关联这两个帐户吗?
  • 我们需要确保正在创建的客户端用户帐户还具有要成功通过身份验证的Identity Server用户帐户吗?

在这个过程中,这些任务应该完成吗?我正在寻找两个应用程序之间的通信流程的一些指导?

编辑

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

这意味着用户的所有用户声明都存储在Identity Server的用户存储中.

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

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

  1. "clientA_role":"管理员"
  2. "clientB_role":"用户"

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

这感觉很糟糕!

有什么建议?

Yah*_*ein 1

如果您有很多客户端应用程序,那么我建议进行用户管理的方法是:

用户管理服务:

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

另外你为什么要这样做:

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

"clientA_role" : "管理员"

"clientB_role" : "用户"

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

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

IdentityServer服务处理身份管理:

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

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

更新:

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

假设我们有以下内容:

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

User1.Roles{"FirstAppUser","SecondAppAdmin"}
Run Code Online (Sandbox Code Playgroud)

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

User2.Roles{"FirstAppAdmin","SecondAppAdmin"}
Run Code Online (Sandbox Code Playgroud)