Lui*_*gio 5 c# asp.net-mvc asp.net-roles asp.net-identity
在我的 ASP.NET Core 应用程序中,我创建了两个角色:
Company是我数据库中的一个实体。
任何用户都可以创建Company并成为它的公司管理员。
但是,如果一个用户以 CompanyViewer 的身份向另一用户提供访问权限Company,则新用户将无权管理此用户Company。
所以作为一个用户,我可以访问很多公司。其中一些我将成为管理员,而另一些我将只是查看者。
此外,还会有其他用户创建的公司,我将无权访问。
问题是:如何同时将特定角色与用户和公司相关联?
这是我现在拥有的一些代码:
用户模型:
public class ApplicationUser : IdentityUser
{
public virtual IList<CompanyUser> Companies { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
公司型号:
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; }
}
Run Code Online (Sandbox Code Playgroud)
控制关系的模型(我将其重命名为 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
}
Run Code Online (Sandbox Code Playgroud)
我如何检查某个序列是否有权编辑公司:
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();
}
Run Code Online (Sandbox Code Playgroud)
我如何创建我打算使用的角色而不是上面的代码:
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"));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1041 次 |
| 最近记录: |