【问题标题】:Where to put user claims in Identity Server 4在 Identity Server 4 中放置用户声明的位置
【发布时间】:2020-06-30 14:35:09
【问题描述】:

我正在使用 Identity Server 4 来管理我组织中所有应用程序的登录信息。 所以我部署了 IdentityServer 4 并连接到 sql server 数据库。 现在我有 5 个客户端应用程序,每个应用程序都有自己的角色/声明(即应用程序 1 有经理、会计师,而应用程序 2 有开发人员、经理、电工,应用程序 3 有设计师、管理员、审阅者......)。 我的问题是: 我是将这些用户角色/声明放在 Identityserver4 数据库中,还是每个应用程序都有自己的数据库来保存自己的用户角色/声明?

谢谢

【问题讨论】:

    标签: sql identityserver4 claims-based-identity


    【解决方案1】:

    您可以通过向 IdentityServer 数据库添加一个额外的表来解决它,例如 RoleClientAuthorizations。您需要在此表中保存 RoleId、ClientId 和 AuthorizationLevel。

    然后您可以在运行时在 ProfileService 中返回有关该客户端的所有声明。

    public class ProfileService : IProfileService
    {
        private readonly IUserClaimsPrincipalFactory<ApplicationUser> _claimsFactory;
        private readonly UserManager<ApplicationUser> _userManager;
        private readonly IClientService _clientService;
        public ProfileService(UserManager<ApplicationUser> userManager, IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory,IClientService clientService)
        {
            _userManager = userManager;
            _claimsFactory = claimsFactory;
            _clientService = clientService;
        }
        public async Task GetProfileDataAsync(ProfileDataRequestContext context)
        {
            var sub = context.Subject.GetSubjectId();
            var user = await _userManager.FindByIdAsync(sub);
            var principal = await _claimsFactory.CreateAsync(user);
            var clientId = context.Client.ClientId;
    
            var claims = principal.Claims.ToList();
    
            --You will get role client information from RoleClientAuthorization table here
            var userAuthorizationLevelClaim = _clientService.GetUserAuthorizationLevel(clientId, sub);
            if(userAuthorizationLevelClaim != null)
            {
                claims.Add(new Claim("authorizationLevelCode", userAuthorizationLevelClaim.AuthorizationLevelId.ToString()));
                claims.Add(new Claim("authorizationPrivilegeType", userAuthorizationLevelClaim.PrivilegeType));
            }
    
            context.IssuedClaims = claims;
        }
    
        public async Task IsActiveAsync(IsActiveContext context)
        {
            var sub = context.Subject.GetSubjectId();
            var user = await _userManager.FindByIdAsync(sub);
            context.IsActive = user != null;
        }
    

    在启动中;

    services.AddIdentity()
            .AddProfileService<ProfileService>();
    

    【讨论】:

    • 谢谢,所以您的解决方案是将它们放在 IdentityServer 数据库中......我看到了这样做的好处。但是,为了管理客户端应用程序角色,客户端应用程序必须有权修改 IdentityServer 4 db。我会试试这个解决方案...
    • 实际上,客户端不需要访问 IdentityServerDb,我使用一个只有系统管理员使用的通用应用程序来管理它,从这个应用程序中,您可以通过向 RoleClientAuthorization 表添加数据来管理所有客户端及其角色。我知道这需要更多的工作,但我认为这是最好的解决方案。
    • 如果可以的话,我会很高兴你回答我的:)
    • 再次感谢,您是对的。我想知道您如何将这些角色“连接”到客户端应用程序中您自己的数据? (即,如果我的客户端应用程序中有 Projects 表,您如何指定项目用户有权访问(CRUD 操作)?)再次感谢
    • 此时,您应该在您的 api 端点中解决它。如果您为所有客户端使用通用 api,则很难管理它。否则,您可以指定即。 roleX 可以通过端点上方的 (Roles="Admin") 属性访问 AddProject 方法
    【解决方案2】:

    这听起来有点像您混淆了身份验证和授权。您的身份不应该从一个应用程序到另一个应用程序发生变化——您是谁以及您由什么组成是一个常数(ish),并且您的身份不应该仅仅因为您现在在不同的应用程序上而改变。 是的,您的角色可能会因应用程序以及您的权限和授权决策而异,但不会因您的身份而异。 https://leastprivilege.com/2016/12/16/identity-vs-permissions/

    使用 IdentityServer 来管理身份并颁发身份证明非常棒,但您应该寻找一种不同的解决方案来在您的应用程序中授权用户......让这些应用程序决定是否在提供的身份的情况下,用户被允许做这件事。这可能是基于角色的,或者涉及更多的东西。这意味着您应该管理用户在每个应用程序中拥有的应用程序角色,而不是使用身份服务器。

    【讨论】:

    • 我同意,每个应用程序都管理它的权限。问题是经过身份验证的用户与其在应用程序上的角色/声明之间的映射。如果我将角色/声明放入 IS4,那么当我对用户进行身份验证时,我可以将它们放入令牌中。如果我将它们放在应用程序中,那么我需要跟踪用户及其在我所有应用程序中的角色,最终这可能导致重复(IS4 和应用程序都必须包含用户数据),更难的配置(必须创建更多的用户管理接口一个用于 IS4,每个应用一个接口,并在两端配置相同的用户),甚至更多。
    • 或者您创建一个集中式授权系统(有关 IdentityServer 创建者如何想象授权系统工作的示例,请参见 PolicyServer)。您可以说“IS4 和应用程序都必须包含用户数据”,或者您可以将其视为“IS4 包含身份信息,应用程序包含有关身份在此应用程序中可以做什么的数据。是的,它是“用户数据”,但目的完全不同:一个是证明身份验证,另一个是证明授权。
    • 您不需要在您的应用程序中维护完整的用户数据(如重复的电子邮件地址、名字等),只需保留连接身份的数据(例如,在子声明中)使用特定于应用程序的用户数据...例如角色、权限或您想要该应用程序的任何内容。
    猜你喜欢
    • 2020-12-07
    • 1970-01-01
    • 2018-10-16
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2018-04-24
    • 1970-01-01
    相关资源
    最近更新 更多