【问题标题】:Domain logic separation with IdentityServer与 IdentityServer 的域逻辑分离
【发布时间】:2020-03-27 09:19:45
【问题描述】:

我们有具有角色成员资格的 MVC 应用程序和用于 SSO 的 IdentityServer,两者都是独立的应用程序。我们的应用程序中有两个角色——Admin 和 RegularUser。它们每个都有一组特定的属性,例如:

public class Admin
{
    public string Area { get; set; }

    public int Code { get; set;}
}

public class RegularUser
{
    public string SkypeId { get; set; }

    public string HomeAddress { get; set; }
}

根据IdentityServer template,我们应该使用单个 ApplicationUser 类来存储所有配置文件数据。跨多个应用程序存储特定于组织角色的数据的最佳实践是什么?我的想法是将配置文件存储(ApplicationUser,在 IdentityServer 范围内)与域实体(Admin 和 RegularUser,在 MVC 应用程序范围内)分开,并用一个键将它们链接在一起:

public class Admin
{
    public string ApplicationUserId { get; set; }

    public string Area { get; set; }

    public int Code { get; set;}
}

public class RegularUser
{
    public string ApplicationUserId { get; set; }

    public string SkypeId { get; set; }

    public string HomeAddress { get; set; }
}

当我们在成功登录到 MVC 应用程序后从 SSO 重定向时,我们可以像这样在控制器中获取 Admin 或 RegularUser:

[Authorize]
public async Task<IActionResult> SomeAction()
{
    string userId = _userManager.GetUserId(User);

    if (User.IsInRole("Admin"))
    {
        Admin admin = await _adminRepository.GetByApplicationUserId(userId);
        /* logic for admin */
    }

    if (User.IsInRole("RegularUser"))
    {
        RegularUser regularUser = await _regularUserRepository.GetByApplicationUserId(userId);
        /* logic for regularUser */
    }

    ...
}

【问题讨论】:

    标签: identityserver4


    【解决方案1】:

    您也可以使用 IdentityServer 进行授权。

    1. 为每个应用程序定义一个 IdentityResource 并为其定义一些 UserClaimTypes。

      new IdentityResource("app1_permissions", new string[] { "permission_in_app1" });

    2. 用用户在 app1 中的权限填写 permission_in_app1 声明。

      new Claim("permission_in_app1","[read1,write2]")

    3. 在您的客户端中,当您重定向用户时,向 IdentityServer 请求 app1_permissions 范围。

      scope: app1_permissions openid profile

    每个用户都有一个声明集合,其中 user1 具有与 user2 不同的信息。

    声明是发行人对某个主题的声明。声明表示在身份验证和授权操作的上下文中有用的主题属性。

    使用基于声明的身份,我们可以存储有关每个用户的不同信息。

    Claim Class

    【讨论】:

    • 感谢您的回答,但这不是我想要的。我不知道如何在一个 ApplicationUser 类中存储不同的配置文件数据。
    • 谢谢!您使用声明来存储角色特定信息的建议在我看来有点奇怪,主要是因为此信息未用于上下文身份验证或授权过程。此外,所有声明都存储在 jwt 令牌中,这个令牌的大小对我来说似乎很重要。
    • 欢迎您,用户声明不会包含在 jwt 令牌中。不用担心令牌大小。
    • 根据jwt.io/introduction 声明存储在令牌的有效负载部分
    • 在您的 startup.cs 配置中,有一个属性会在身份验证后加载 UserInfo。有关更多信息,请查看(使用 Angular、Asp.Net Core 和 IdentityServer 进行用户身份验证和身份验证)[fullstackmark.com/post/21/…
    猜你喜欢
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多