Проверка подлинности пользователей ASP.NET не работает
У меня есть приложение ASP.NET MVC 5. Я использую стандартный поставщик ASP.NET Identity для управления пользователями и ролями. Очень важно, что я использую IdentityUser из собственного проекта репозитория, но это выглядит нормально. Я могу регистрироваться, регистрироваться, редактировать пользователей и управлять их ролями.
Я добавляю пользователя к роли с этими строками:
UserManager.AddToRole(userdetail.Id, r);
db.Entry(userdetail).State = EntityState.Modified;
db.SaveChanges();
Кажется, что он работает на уровне DB.
Но я не могу использовать аутентификацию на основе ролей, на самом деле просто
HttpContext.User.IsInRole("Administrator")
тоже не работает.
[Authorize(Roles="Administrator")]
тоже не работает.
Я могу проверить только этот метод, независимо от того, является ли пользователь администратором:
UserManager.IsInRole(userID, "Administrator").
Почему?
В каждом учебнике, что я нашел, все работает нормально. Может быть причиной другого репозитория проекта? Или ASP.NET Identity так сильно нарушена?
Пожалуйста, совет,
Ответы
Ответ 1
Кажется, есть проблема. [Вопрос по дизайну]
- Имена ролей чувствительны к регистру в AuthorizeAttribute и User.IsInRole
- Имена ролей нечувствительны к регистру в UserManager.IsInRole
Кроме того, проверка правильности имени роли используется для проверки.
[Вышеуказанное основано на тесте, выполненном с использованием приведенного ниже кода. Role Name = "Admin", пользователь добавлен в роль "Admin".]
[Authorize(Roles="Admin")] /*True as "Admin" has A capital as entered in Role name*/
public ActionResult Secured()
{
if (User.IsInRole("admin")) /*This is False*/
{
Console.WriteLine("In");
}
if(UserManager.IsInRole(User.Identity.GetUserId(), "admin")) /*This is True!!*/
{
Console.WriteLine("In");
}
return View();
}
Если мы изменим атрибут на [Authorize(Roles="admin")]
, он будет перенаправлен на страницу входа.
Ответ 2
В этом случае вам нужно снова выйти и снова войти в систему.
Поскольку данные ролей также хранятся в файлах cookie,
Поэтому вы должны снова выпустить cookie для его работы.
Ответ 3
У вас есть эта запись в вашем web.config?
<roleManager enabled="true">
<providers>
<clear />
<add connectionStringName="ApplicationServices" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" applicationName="/" />
</providers>
</roleManager>
Кроме того, если я правильно помню, существует другое пространство имен для сборки поставщика ролей в разных версиях .NET.