В моем основном приложении ASP.NET я создал две роли:
- CompanyAdministrator
- 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"));
}