在 Identity Server 4 中放置用户声明的位置

Where to put user claims in Identity Server 4

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

谢谢

您可以通过向 IdentityServer 数据库添加一个额外的 table 来解决它,例如 RoleClientAuthorizations。在这个table.

中你需要持有RoleId,ClientId和AuthorizationLevel

然后您可以return运行时在 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>();

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

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