Как связать роль пользователя с настраиваемым объектом с помощью ASP.NET Core Identity - PullRequest
0 голосов
/ 01 ноября 2018

В моем основном приложении ASP.NET я создал две роли:

  1. CompanyAdministrator
  2. CompanyViewer

Company - это объект в моей базе данных.

Любой пользователь может создать Company и стать его администратором.

Однако, если один пользователь предоставляет доступ другому пользователю как CompanyViewer для одного Company, новый пользователь не сможет управлять пользователями в этом Company.

Так что, как пользователь, я могу получить доступ ко многим компаниям. В некоторых из них я буду администратором, а в других я буду просто зрителем.

Также будут компании, созданные другими пользователями, к которым у меня не будет никакого доступа.

Вопрос: как я могу связать определенную роль с пользователем и компанией одновременно?

Вот какой-то код, который у меня есть ultil сейчас:

Модель пользователя:

 public class ApplicationUser : IdentityUser
{        
    public virtual IList<CompanyUser> Companies { get; set; }
}

Модель компании:

public class Company
{
    public long ID { get; set; }

    [Display(Name = "Title")]
    public string Title { get; set; }

    [Display(Name = "Users")]
    public virtual IList<CompanyUser> Users { get; set; }
}

Модель для управления отношениями (я переименую ее в CompanyPermission):

public class CompanyUser
{
    [ForeignKey("Company")]
    public long CompanyID { get; set; }

    public Company Company { get; set; }

    [ForeignKey("ApplicationUser")]
    [MaxLength(450)]
    public string UserID { get; set; }

    public ApplicationUser User { get; set; }

    public CompanyUserRole Role { get; set; }
}

public enum CompanyUserRole
{
    Administrator = 1,
    Viewer = 2
}

Как я проверяю, есть ли у какого-то сервера разрешение на редактирование компании:

ApplicationUser appUser = await _userManager.GetUserAsync(User);
var currentCompany = await _context.Company.Include(c => c.Users).SingleOrDefaultAsync(m => m.ID == id);

if (!currentCompany.Users.Where(c => c.UserID == appUser.Id && c.Role == CompanyUserRole.Administrator).Any())
{
    return NotFound();
}

Как я создаю роли, которые я намерен использовать вместо приведенного выше кода:

var companyAdminRole = await _roleManager.FindByNameAsync("CompanyAdmin");
        if (companyAdminRole == null)
        {
            companyAdminRole = new IdentityRole("CompanyAdmin");
            await _roleManager.CreateAsync(companyAdminRole);

            await _roleManager.AddClaimAsync(companyAdminRole, new Claim("Permission", "company.view"));
            await _roleManager.AddClaimAsync(companyAdminRole, new Claim("Permission", "company.update"));
            await _roleManager.AddClaimAsync(companyAdminRole, new Claim("Permission", "company.users.view"));
            await _roleManager.AddClaimAsync(companyAdminRole, new Claim("Permission", "company.users.manage"));
            await _roleManager.AddClaimAsync(companyAdminRole, new Claim("Permission", "company.analitycs.view"));
            await _roleManager.AddClaimAsync(companyAdminRole, new Claim("Permission", "company.analitycs.download"));
        }

        var companyViewerRole = await _roleManager.FindByNameAsync("CompanyViewer");
        if (companyViewerRole == null)
        {
            companyViewerRole = new IdentityRole("CompanyViewer");
            await _roleManager.CreateAsync(companyViewerRole);

            await _roleManager.AddClaimAsync(companyViewerRole, new Claim("Permission", "company.view"));
            await _roleManager.AddClaimAsync(companyViewerRole, new Claim("Permission", "company.analitycs.view"));
            await _roleManager.AddClaimAsync(companyViewerRole, new Claim("Permission", "company.analitycs.download"));
        }
...