Аутентификация на основе ролей в новом шаблоне Интернета MVC 4 с использованием simplemembership
мне нравится новая функция simplemembership в интернет-шаблоне MVC 4 со ссылками на OAuth для внешних Логинов в VS 2012 RTM. По большей части функция аутентификации работает. Однако даже потратив на это более 8 часов, я не могу реализовать авторизацию на основе ролей для работы на моих контроллерах. SimpleMembership оказывается чем угодно, но не простым.
Я искал stackoverflow, googled и прочитал последнюю версию Джон Галлоуэй, пытался многие предложения и до сих пор не смогли решить эту проблему. Все началось с получения ошибки подключения Sql и не мог понять, почему, когда строка подключения и все остальное было хорошо. Потребовалось много часов, чтобы выяснить, что это класс ролей, который вызывает проблему.
атрибут [Authorize] на контроллерах работает как и раньше для базовой аутентификации. Но каждый раз, когда я пытаюсь использовать роли, он дает ошибку соединения sql (потому что он возвращается к старому DefaultRolesProvider который пытается подключиться к файлу sqlexpress aspnetdb по умолчанию и терпит неудачу). Что-то вроде:
[Authorize(Roles="admin")]
не работает. Это сработает, если я вернусь к старому. asp.net поставщики членства, но затем я теряю простые таблицы базы данных, подтверждение и восстановление баз токенов, более безопасное хэширование паролей и, что более важно, внешние логины через OAuth.
единственное, что работает внутри кода и представлений бритвы, это
User.IsInRole("admin")
что нормально для пунктов меню и таких, но ver громоздко реализовать внутри каждого отдельного действия в контроллере (и мне не нравится, что он проверяет только одну роль за раз).
Я буду очень признателен за любые рекомендации по решению этой проблемы.
2 ответов
нашел ответа здесь Golchin Мехди который, кажется, заботится о:
[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] на все контроллеры, поскольку пользователь может изначально приземлиться на любой странице, используя внешние ссылки.
он все еще не может понять, как инициализировать класс SimpleRolesProvider, чтобы сделать больше управления ролями, а не просто User.IsInRole()
.
эти вещи работают лучше на веб-страницах webmatrix сайт и, очевидно, порт ot MVC не завершен. Он конфликтует и путается с default asp.net поставщики членства.
редактировать
Хорошо, я не думал [InitializeSimpleMembership]
фильтр может применяться глобально, помещая эту строку в FilterConfig.cs
в папке App_Start:
filters.Add(new InitializeSimpleMembershipAttribute());
это решает эту проблему. Теперь нужно решение для инициализации SimpleRolesProvider, иначе мне придется писать свои собственные роли поставщик.
обновление:
этой сообщение Скотта Аллена решил все мои проблемы.
в интернете.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;
была такая же проблема, когда я перемещал свое веб-приложение из VS2010/MVC3 в VS2012/MVC4.
и не удалось получить [InitializeSimpleMembership] для работы.
узнал, что добавление этого веб-узла.config делает трюк:
<appSettings>
<add key="enableSimpleMembership" value="false" />
</appSettings>
и все работает нормально как и раньше.