Ответ 1
Нашел ответ здесь Мехди Гольчин, который, по-видимому, заботится:
[Authorize(Roles="admin,editor,publisher")]
Если я также добавлю это в домашний контроллер:
[InitializeSimpleMembership]
Поскольку этот атрибут находится на контроллере учетных записей, база данных SimpleMembership инициализируется только после первого использования контроллера учетных записей, например login/register. Даже когда текущий пользователь регистрируется в cookie, база данных не инициализируется и поэтому выдает ошибку. Одним из решений является включение этого атрибута в домашний контроллер, который вызывается при запуске моего веб-сайта. Но тогда его необходимо разместить на каждом контроллере, потому что я проверяю роли и отображаю различные пункты меню на основе роли.
Это плохой дизайн, так как база данных должна быть инициализирована в App_Start, а не при первом использовании.
Я попытался поставить
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
в Global.asax
Application_Start()
, и он позаботится о проверке роли в элементах меню с помощью User.IsInRole("admin")
, но затем произведет ошибку в любом контроллере с атрибутом [Authorize(Roles="admin")]
, даже если применяется дополнительный атрибут [InitializeSimpleMembership]
.
Итак, прямо сейчас решение состоит в том, чтобы поместить `[InitializeSimpleMembership] на всех контроллерах, поскольку пользователь может сначала приземлиться на любую страницу, используя внешние ссылки.
Он все еще не может понять, как инициализировать класс SimpleRolesProvider, чтобы выполнять больше управления ролью, а не просто User.IsInRole()
.
Эти вещи работают лучше на веб-сайте webmatrix, и, очевидно, порт MVC не завершен. Он конфликтует и запутывается с поставщиками членства asp.net по умолчанию.
ИЗМЕНИТЬ
OK Я не думал, что фильтр [InitializeSimpleMembership]
можно применить глобально, поместив эту строку в FilterConfig.cs
в папку App_Start:
filters.Add(new InitializeSimpleMembershipAttribute());
Это позаботится об этой проблеме. Теперь нужно решение для инициализации SimpleRolesProvider, иначе мне придется написать собственный поставщик ролей.
UPDATE:
Этот пост Скотта Аллена решил все мои проблемы.
Включив это в web.config:
<roleManager enabled="true" defaultProvider="simple">
<providers>
<clear/>
<add name="simple" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/>
</providers>
</roleManager>
<membership defaultProvider="simple">
<providers>
<clear/>
<add name="simple" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/>
</providers>
</membership>
все методы классов Роли и Членства становятся доступными и могут быть инициализированы в коде следующим образом:
var roles = (SimpleRoleProvider) Roles.Provider;
var membership = (SimpleMembershipProvider) Membership.Provider;