Подтвердить что ты не робот

Почему нет [Authorize (Roles = "Admin" )], работающий в RTM MVC 5 с идентификатором ASP.NET?

Работает ли [Authorize(Roles = "Admin")] из коробки в RTM MVC 5 с идентификатором ASP.NET?

Мне не повезло. Обратите внимание, что [Authorize] и [Authorize(Users = "AdminUser")] работают очень хорошо, а таблицы AspNetUserRoles и AspNetRoles заполняются так, как я ожидал бы их, установив связь между пользователем AdminUser и ролью администратора. Эта проблема кажется специфичной для ролей.

4b9b3361

Ответ 1

И ответ: UserManager DbContext должен иметь ленивую загрузку, чтобы роли пользователя отображались в приложении обычным, ожидаемым образом. Как оказалось, не весь мой код был "из коробки". Я немного настроил свой DbContext. Надеюсь, в будущем Microsoft обойдутся в эту ошибку интеграции, обеспечив загрузку коллекции чем-то вроде userDbContext.Users.Include(o => o.Roles).SingleOrDefault(...).

  • DO: ApplicationDbContext.Configuration.LazyLoadingEnabled = true;
  • НЕ НЕ: ApplicationDbContext.Configuration.LazyLoadingEnabled = false;

Обратите внимание, что если ApplicationDbContext.Configuration.LazyLoadingEnabled не задано в вашем коде, оно по умолчанию равно true. Поэтому оставить эту строку так же хорошо, как установить ее на true.

Etc.

Здесь моя догадка о том, что происходит, когда ленивая загрузка отключена, свойство Roles объекта IdentityUser/ApplicationUser имеет значение null или пусто, когда пользовательский пользователь или пользовательский сервер обращаются к нему, потому что эта коллекция не была загружена вручную, Затем код выполняется так же, как ни один из ролей не был назначен пользователю, когда на самом деле эта коллекция просто не была загружена.

А, аромат тихой неудачи. Если бы код делал некоторый шум, когда все выглядело не так.

Ответ 2

Пользователю может потребоваться повторная аутентификация для получения новых требований, которые включают членство в роли администратора. Поскольку MVC 5 использует идентификатор ASP.NET из коробки, а по умолчанию в MVC 5, ASP.NET Identity сохраняет заявки как роли в файлах cookie пользователя, эта информация может стать устаревшей (следовательно, в базе данных говорится одно, но cookie пользователя говорит что-то другое). Повторная аутентификация пользователя обновит свои претензии, включая утверждения роли пользователя, в соответствии с текущим состоянием базы данных.

Например:

Если пользователь подписывается перед назначением роли администратора в базе данных, пользователю будут предоставлены претензии, но они не будут включать их назначение в роль администратора. Если позже они добавляются в роль администратора, заявки, хранящиеся в их файлах cookie, не обновляются автоматически. Вместо того, чтобы обновлять только базу данных, приложение должно повторно аутентифицировать их до того, как их старые требования будут заменены новыми утверждениями, которые включают членство в роли администратора. Когда пользователь вручную выйдет из системы и вернулся, наиболее очевидным способом является повторная аутентификация этого пользователя.

Здесь статья о Использование претензий в Identity ASP.NET

Ответ 3

<system.webServer>
<modules>
    <remove name="RoleManager" />
</modules>
</system.webServer>