Аутентификация на основе ролей в новом шаблоне Интернета 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>

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