Обработка безопасности MVC ... переопределить поставщика членства, фильтр действий или что-то еще? Не уверен, как справиться с этим - PullRequest
2 голосов
/ 22 февраля 2010

Я нахожусь в такой ситуации, когда меня действительно смущает вопрос о том, как работать с безопасностью в моем приложении ASP .NET MVC. Вот что я знаю, я хочу сделать:

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

2) Это будет звучать как противоречие, но я хочу использовать Entity Framework и, да, MS Sql Server 2005. То, что я делаю это, не означает, что я хочу быть вовлеченным в эти решения. Я видел, что ряд других поставщиков dbms предоставляют поддержку EF, так что это выглядит намного лучше.

Базовая настройка безопасности довольно проста. Есть пользователи. У пользователей есть роли. У меня есть 3 основные таблицы из этого: User, Role, UserRoles.

Итак, если бы это было профессиональное веб-приложение, на создание которого я заключил контракт, что было бы хорошим способом сделать это? Создание пользовательской реализации провайдера членства кажется наиболее тщательным, и кажется, что это довольно переносимое решение. Я видел несколько статей, в которых говорилось только о создании ActionFilter или CustomAttribute. Может быть, это одно и то же; как я уже сказал, я очень запутался.

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

Я гуглил это. Я прочитал десятки статей и нашел очень много реализаций. Я прошел через ASP .NET Unleashed, в которой есть только стандартное объяснение поставщика членства. Я на самом деле просто пытаюсь найти здесь какой-нибудь солидный профессиональный совет от тех из вас, кто работал в промышленности и делал это какое-то время.

Спасибо за ваше время.

Обновление.

Мне удалось освободить файл CSS от аутентификации. Я добавил следующее в web.config (уровень приложения).

  <location path="Content">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>
  <location path="~/Views/Account">
    <system.web>
      <authorization >
        <allow users="*"  />
      </authorization>
    </system.web>
  </location>

Теперь возникла логическая проблема. Ранее я указывал приложению в файле web.config, что URL-адрес входа: LogOn.aspx. С тех пор как я реализовал пользовательское членство и провайдера, я решил пойти со стандартной страницей входа в аккаунт. На странице вы можете зарегистрироваться для новой учетной записи; однако, щелкнув гиперссылку «Регистрация», вы останетесь на странице входа в систему. Очевидно, что новые пользователи не будут очень рады этому. Я попытался сделать так, чтобы все страницы в папке Views / Account не проходили проверку подлинности с помощью XML выше, но, похоже, это не сработало. Мысли?

**************************************** ОБНОВЛЕНО СНОВА ***** ***********************************

Видимо, тегу Location просто нужно имя каталога, а не дерево каталогов. По крайней мере, мне кажется, это так. Я изменил 2-й тег местоположения, чтобы он выглядел так:

  <location path="Account">
    <system.web>
      <authorization >
        <allow users="*"  />
      </authorization>
    </system.web>
  </location>

И теперь я могу получить доступ ко всем файлам в папке представлений учетной записи, а также ко всем действиям контроллера учетной записи. Здесь есть интересная ирония: я пошел и создал собственную реализацию провайдера членства (что я очень рад, что сделал), поэтому я могу использовать ванильные страницы Register & LogOn, которые поставляются с ASP .NET MVC. Я полагаю, если это не сломано, не чините это. Так скажите мне ... насколько комфортно было бы помещать эти страницы в рабочую среду с минимальными изменениями? Просто любопытно. Я нахожусь в точке, где я просто пытаюсь понять, КАК делать эти вещи; Я не могу реально оценить, хорошо ли делать или использовать X, или еще не совсем.

1 Ответ

3 голосов
/ 22 февраля 2010

Насколько я знаю, вы сможете делать то, о чем говорите, без лишней суеты ...

Поскольку ASP.Net MVC построен поверх ASP.Net, вы должны иметь возможность воспользоваться способностью ASP.Net добавить своего собственного провайдера членства, как вы описали. После создания ASP.Net MVC для использования этого провайдера все, что вам нужно сделать, - это зарегистрировать своего провайдера в файле web.config и просто добавить существующий атрибут Authorize для любых контроллеров, которые вы хотите заблокировать.

Этот существующий атрибут Authorize не привязан к данному провайдеру, он просто смотрит, какой провайдер является текущим, и в вашем случае ваш пользовательский провайдер будет текущим.

Вы сказали, что читали статьи о создании пользовательских провайдеров, поэтому я не буду вдаваться в подробности, и вам не нужно создавать собственный атрибут / фильтр (который ActionFilter является атрибутом, но атрибут не всегда является ActionFilter ActionFilter - это концепция MVC, атрибуты - это концепция .Net - надеюсь, это поможет).

Похоже, у вас должно быть все, что нужно для реализации.

Дайте мне знать, если вам нужно больше.

UPDATE:

Мне бы хотелось догадаться, что вот что не так с css - я только что столкнулся с очень похожей проблемой ... Короче говоря, я думаю, что MVC пытается аутентифицировать получение файла CSS, и потому вы еще не вошли в систему, это не позволяет вам скачать CSS.

Чтобы убедиться в этом, сделайте что-то похожее на следующее (обратите внимание, что код идет в global.asax):

    public void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        var shouldAuthenticate = true;

        if (Request.Path.Contains("/Error") || Request.Path.Contains(".css") || Request.Path.Contains(".jpg") ||
            Request.Path.Contains(".png") || Request.Path.Contains(".js") || Request.Path.Contains(".gif") || Request.Path.Contains("/asset.axd?id=")) 
            shouldAuthenticate = false;

        ...
    }

Когда вы отлаживаете свое приложение, попробуйте поставить здесь точку останова и посмотреть, сколько раз оно вызывается при загрузке страницы входа в систему и что такое «Request.Path» для каждой ... Если вы видите, что это попытка аутентификации этих активов - это ваша проблема.

...