Как расширить роли для нескольких местоположений / сайтов с основной идентификацией Asp.Net - PullRequest
1 голос
/ 13 мая 2019

У меня есть API, который используется в многосайтовой / многопозиционной среде.На данный момент каждому пользователю определены роли, но он заблокирован только в одном месте.Мне нужно расширить это, чтобы пользователь мог иметь роли администратора для одного местоположения, а затем может быть обычным пользователем в другом месте.Они также могут не иметь никаких ролей / не иметь доступа к множеству местоположений.

Вот то, с чем я сейчас работаю (asp.net core 2.2):

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int? LocationId { get; set; }
    public virtual Locations Locations { get; set; }
    public int? ContactPersonId { get; set; }
    public virtual ContactPerson ContactPerson { get; set; }
}

public class Locations
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ApplicationUser ApplicationUser { get; set; }
}

public class ContactPerson
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public string UserId { get; set; }
    public virtual ApplicationUser ApplicationUser { get; set; }

    public virtual ICollection<ContactOrganizationPerson> ContactOrganizationPeople { get; set; }
    public virtual ICollection<ContactAddress> ContactAddresses { get; set; }
    public virtual ICollection<ContactPhone> ContactPhones { get; set; }
    public virtual ICollection<ContactEmail> ContactEmails { get; set; }

}

Я планируюпри изменении отношения таблицы ApplicationUser к местоположениям на «многие ко многим», которое связывает пользователя с местоположениями, к которым ему разрешен доступ.Я хотел разместить полезную нагрузку в таблице отношений M2M, в которой были бы указаны UserId, LocationId и Roles, но я бы предпочел, чтобы Identity обрабатывал это, если это возможно.

Есть ли способ расширить AspNetUserRoles, чтобы я мог указатьОтношение пользователя к роли для каждого местоположения?Или есть лучший способ сделать это?

1 Ответ

1 голос
/ 14 мая 2019

Я не уверен, поможет ли это вам, но я расширил .Net Core с функциональностью с помощью IAuthorizationRequirement.

public class CustomRequirement : IAuthorizationRequirement
{
    public CustomRequirement ()
    {
    }
}

Создать новый класс

public class CustomHandler : AuthorizationHandler<CustomRequirement>

Переопределить HandleRequirementAsync

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomRequirement requirement)

Здесь вы можете извлечь информацию о пользователе из БД, сравнить и т. Д. Если пользователь не разрешен, вернуть

return Task.CompletedTask;

Если пользователь разрешен, тогда используйте

context.Succeed(requirement);

Перед возвращением. Тогда в вашем startup.cs:

services
            .AddAuthorization(options =>
            {
                options.AddPolicy("CustomPolicy", policy =>
                    policy.Requirements.Add(new CustomRequirement()));
            })

И тогда в ваших контроллерах вы можете добавить атрибут

[Authorize(Policy = "CustomPolicy", Roles = "Admin")]

Если требование не выполнено, пользователь получит 401 несанкционированный, что может быть не тем, что вы хотите.

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