Сначала я расскажу о шагах, которые привели меня к проблемам с авторизацией ролей.
Сначала я добавлю 2 роли в свой construstor в HomeController.cs
public HomeController()
{
_db = new ApplicationDbContext();
_roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(_db));
_userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(_db));
List<string> roles = new List<string>()
{
"User", "Admin"
};
foreach(string role in roles)
{
if (!_roleManager.RoleExists(role))
{
_roleManager.Create(new IdentityRole(role));
}
}
}
Роли успешно добавленыв базу данных.
Затем я добавляю роль новому зарегистрированному пользователю в задачу Регистрация в AccountController.cs
...
if (result.Succeeded)
{
await UserManager.AddToRoleAsync(user.Id, "User");
...
Роль User
была успешно назначена новому пользователю (в таблице: AspNetUserRoles
)
Тогда, если я изменю эту роль пользователя на Admin
, как это:
string userId = User.Identity.GetUserId<string>();
_userManager.RemoveFromRole(userId, "User");
_userManager.AddToRole(userId, "Admin");
И проверь это на мой взгляд (Razor) так:
@if(User.IsInRole("Admin"))
{
<p> ok </p>
}
И проверьте это в моем HomeController через [Authorize(Roles = "Admin")]
.
Тогда дважды произойдет сбой.if(User.IsInRole("Admin"))
возвращает false и [Authorize(Roles = "Admin")]
также не позволяют мне получить доступ к методу, указанному ниже.
Более того, этот новый зарегистрированный пользователь имеет только роль User
, потому что [Authorize(Roles = "User")]
работает и if(User.IsInRole("User"))
также возвращает true.
Что странно в том, что IList<string> roles
:
string userId = User.Identity.GetUserId<string>();
IList<string> roles = _userManager.GetRoles(userId);
На самом деле правильно возвращать новый список ролей при добавлении новой роли через _userManager.AddToRole(userId, "Admin");
, так что пользователь с ролью по умолчанию User
теперь имеетпросто 1 роль Admin
(потому что я удаляю предыдущую роль), которая кажется логичной и она работает.
Если вы знаете, почему мою роль по умолчанию User
нельзя изменить, как описано выше, опубликуйте свой ответ, спасибо.