Проверка подлинности на основе ролей в новом интернет-шаблоне MVC 4 с помощью simplemembership
мне нравится новая функция simplemembership в интернет-шаблоне MVC 4 со ссылками на OAuth для внешних Логинов в VS 2012 RTM. По большей части функция аутентификации работает. Однако даже после того, как я потратил на это более 8 часов, я не могу реализовать авторизацию на основе ролей для работы на моих контроллерах. SimpleMembership оказывается совсем не простым.
Я искал stackoverflow, гуглил и читал последние по Джон Галлоуэй, пытался многие предложения и до сих пор не смогли решить эту проблему. Все началось с получения ошибки подключения Sql и не мог понять, почему, когда строка подключения и все остальное было хорошо. Потребовалось много часов, чтобы выяснить, что это класс ролей, который вызывает проблему.
атрибут [Authorize] на контроллерах работает как и раньше для обычной проверки подлинности. Но каждый раз, когда я пытаюсь использовать роли, он дает ошибку подключения sql (потому что он возвращается к старому DefaultRolesProvider который пытается подключиться к файлу sqlexpress aspnetdb по умолчанию и терпит неудачу). Что-то вроде:
[Authorize(Roles="admin")]
не работает. Это сработает, если я вернусь к старому asp.net поставщики членства, но затем я теряю простые таблицы базы данных, подтверждение и восстановление баз токенов, более безопасное хэширование паролей и, что более важно, внешние логины через OAuth.
единственное, что работает внутри кода и razor views-это
User.IsInRole("admin")
что нормально для пунктов меню и таких, но ver громоздко реализовать внутри каждого отдельного действия в контроллере (и мне не нравится, что он тестирует только для одной роли за раз).
Я буду очень признателен за любые рекомендации по решению этой проблемы.
2 ответа:
нашел ответа здесь Мехди Голчин который, кажется, заботится о:
[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 не является полным. Он конфликтует и путается с дефолтом asp.net поставщики членства.
EDIT Хорошо, я не думал
[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] для работы.
выяснил, что добавление этого в ваш интернет.конфиг делает трюк:
<appSettings> <add key="enableSimpleMembership" value="false" /> </appSettings>
и все работает нормально как и раньше.