Где размещать заявки пользователей в Identity Server 4 - PullRequest
0 голосов
/ 19 марта 2020

Я использую Identity Server 4 для управления своими именами входа для всех приложений в моей организации. Итак, IdentityServer 4 развернут и подключен к sql базе данных сервера. Теперь у меня есть 5 клиентских приложений, каждое из которых имеет свои роли / претензии (ie приложение 1 имеет менеджера, бухгалтера, а приложение 2 имеет разработчика, менеджера, электрика, приложение 3 имеет дизайнера, администратора, рецензента ...). Мой вопрос: помещать ли эти пользовательские роли / утверждения в базу данных Identityserver4, или у каждого приложения должна быть своя собственная база данных, содержащая свои собственные пользовательские роли / утверждения?

Спасибо

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Вы можете решить эту проблему, добавив одну дополнительную таблицу в базу данных 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>();
0 голосов
/ 20 марта 2020

Звучит так, будто вы смешиваете аутентификацию и авторизацию. Ваша личность не должна меняться от приложения к приложению - кто вы и из чего состоите, является константой (i sh), и ваша личность не должна меняться только потому, что вы сейчас находитесь в другом приложении. Да, ваши роли могут меняться от приложения к приложению, а также ваши разрешения и решения по авторизации, но не ваша личность. https://leastprivilege.com/2016/12/16/identity-vs-permissions/

Использование IdentityServer для управления удостоверениями и выдачи удостоверений личности - это замечательно, но вам следует искать другое решение для авторизации пользователя в ваших приложениях ... то, что позволяет этим приложениям решать, разрешено ли пользователю с учетом предоставленной идентификационной информации делать вещь . Это может быть основано на роли или что-то более сложное. Это означает, что вы должны управлять ролями приложений, которые пользователь имеет с каждым приложением , а не с сервером идентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...