Почему [Authorize (Roles = "Admin")] не работает в MVC 5 RTM с ASP.NET личность?

тут [Authorize(Roles = "Admin")] работа из коробки в MVC 5 RTM с ASP.NET личность?

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

3 ответов


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

например:

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

вот статья о использование утверждений в ASP.NET личность


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

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

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

Etc.

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

Ах, аромат молчаливого провала. Код издавал какой-то шум только тогда, когда все выглядело не так.


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