Проверка подлинности на основе ролей в новом интернет-шаблоне 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 53

2 ответа:

нашел ответа здесь Мехди Голчин который, кажется, заботится о:

[Authorize(Roles="admin,editor,publisher")]

если я также добавлю это в домашний контроллер:

 [InitializeSimpleMembership]

поскольку этот атрибут находится на контроллере учетных записей, база данных SimpleMembership инициализируется только после первого использования контроллера учетных записей, такого как login/register. Даже когда текущий пользователь входит в систему из файла cookie, база данных не инициализируется и поэтому выдает ошибку. Одно решение это поставить этот атрибут на домашний контроллер, который вызывается при запуске моего сайта. Но, то он должен быть размещен на каждом контроллере, потому что я проверяю роли и отображать различные пункты меню на основе роли.

это плохой дизайн, так как база данных должна быть инициализирована на App_Start, а не при первом использовании.

я пытался поставить

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);

на Global.asaxApplication_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>

и все работает нормально как и раньше.