Я не знаю, пропускаю ли я какие-то странные настройки или настройки, но я не могу получить, например, User.IsInRole
или Roles.GetRolesForUser()
на работу. Я просто получаю исключение (я думаю, нулевая ссылка), и приложение просто останавливается. Несмотря на то, что я настроил RoleManager для OwinContext, метод Create и т. Д., Например, в проекте Identity Sample, а также включил Role Manager в web.config.
Сначала я решил это, используя другой подход, например, такой: (db - ApplicationDbContext):
var UserID = User.Identity.GetUserId();
var userRoles = db.Roles.Include(r => r.Users).ToList();
var userRoleNames = (from r in userRoles
from u in r.Users
where u.UserId == UserID
select r.Name).ToList();
Это, возможно, не самый оптимизированный способ и может быть изменен на более простую форму, но это сработало для меня и, возможно, не требует столько настроек / зависимостей, как другие подходы.
Второй подход заключается в следующем (добавьте это в ваш класс контроллера):
private ApplicationDbContext db = new ApplicationDbContext();
private ApplicationUserManager _userManager;
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
set
{
_userManager = value;
}
}
private ApplicationRoleManager _roleManager;
public ApplicationRoleManager RoleManager
{
get
{
return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>();
}
private set
{
_roleManager = value;
}
}
Внутри вашего контроллера вы можете теперь сделать, например ::10000
var UserID = User.Identity.GetUserId();
var RolesForUser = await UserManager.GetRolesAsync(UserID);
Я использую приложение ASP.NET MVC 5 только для ясности. RoleManager в этом примере не используется, но его можно использовать для создания, поиска, обновления и т. Д. Ролей. Использование этого подхода позволяет выполнять асинхронные вызовы с использованием await, если это полезно для вашего приложения.