Подтвердить что ты не робот

Проверка подлинности на основе ролей в новом интернет-шаблоне MVC 4 с использованием simplemembership

Мне нравится новая функция simplemembership в интернет-шаблоне MVC 4 со ссылками на OAuth для внешних логинов в RTM VS 2012. Большинство функций проверки подлинности работают. Однако даже после того, как я потратил более 8 часов на это, я не могу реализовать авторизацию на основе ролей для работы с моими контроллерами. SimpleMembership оказывается совсем не простым.

Я искал stackoverflow, googled и прочитал последние John Galloway, пробовал много предложений и до сих пор не смог решить эту проблему, Все началось с получения ошибки подключения Sql и не могло понять, почему, когда строка подключения и все остальное были хорошими. Потребовалось много часов, чтобы понять, что это класс Roles, который вызывает проблемы.

Атрибут [Авторизовать] на контроллерах работает как обычно для базовой проверки подлинности. Но в любое время, когда я пытаюсь использовать Roles, он вызывает ошибку соединения sql (потому что он возвращается к старому DefaultRolesProvider, который пытается подключиться к файлу aspnetdb по умолчанию SqlExpress и не удается). Так что-то вроде:

[Authorize(Roles="admin")]

не работает. Он будет работать, если я вернусь к старым провайдерам членства asp.net, но затем я потеряю простые таблицы базы данных, подтверждение и восстановление баз данных токенов, более безопасное хеширование паролей и, что более важно, внешние логины через OAuth.

Единственное, что работает внутри кодовых и бритвенных представлений, это

User.IsInRole("admin")

который подходит для элементов меню и т.д., но громоздко реализовать внутри каждого действия в контроллере (и мне не нравится, что он проверяет только одну роль за раз).

Я буду очень признателен за любые рекомендации по устранению этой проблемы.

4b9b3361

Ответ 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;

Ответ 2

Была та же проблема, когда я перемещал свое веб-приложение из VS2010/MVC3 в VS2012/MVC4.

И не получилось [InitializeSimpleMembership] работать.

Узнал, что добавление этого в ваш web.config делает трюк:

  <appSettings>
    <add key="enableSimpleMembership" value="false" />
  </appSettings>

И все работает отлично, как раньше.