Авторизация в ASP.NET MVC 2 с использованием файла web.config - PullRequest
4 голосов
/ 06 октября 2010


У меня есть веб-страница ASP.MVC 2, и моя аутентификация сделана так:

FormsAuthentication.SetAuthCookie(user.UserName, false);
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, "fooPage" + user.UserName, DateTime.Now, DateTime.Now.AddMinutes(10), false, String.Empty);

HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket));
Response.Cookies.Add(cookie);  

Теперь я хотел бы настроить свой web.config таким образом, чтобы доступ к нескольким страницам был возможен только при аутентификации пользователя. Мой web.config настроен так:

<configuration>  
  <system.web>  
    <authentication mode="Forms">  
      <forms loginUrl="~/Account/LogIn" timeout="2880"/> //all users can access my web site  
    </authentication>  
    <authorization>  
      <allow users="*"/>  
    </authorization>  
  </system.web>  
  <location path="~/Views/Sales/Index.aspx">  
    <system.web>  
      <authorization>  
        <deny users="?"/> //only authenticated users can access this page  
      </authorization>  
    </system.web>  
  </location>  
</configuration>  

... но это не работает.

Что я делаю не так?

Ответы [ 2 ]

6 голосов
/ 06 октября 2010

Стоп. Если вы попытаетесь использовать в Web.config для защиты приложения MVC, вы в лучшем случае усложняете себе жизнь, а в худшем - открываете гигантская дыра в безопасности в вашем приложении.

Как намекает Джон, использование [Authorize] или чего-то другого, что правильно перехватывает конвейер MVC (декларативный или программный), является только правильным способом сделать это. Команда разработчиков более подробно расскажет об этой проблеме по адресу http://blogs.msdn.com/b/rickandy/archive/2010/08/24/securing-your-mvc-application.aspx.

3 голосов
/ 06 октября 2010

Намного проще поместить атрибут [Authorize] в действие контроллера:

public class SalesController : Controller
{
    [Authorize]
    public ActionResult Index()
    { 
        // etc

Вы также можете поместить атрибут на контроллер вместо того, чтобы помещать его в каждый метод действия ...

Отредактируйте в ответ на ваш комментарий: я не знаю, что это можно сделать с помощью XML, но посмотрите http://www.jigar.net/articles/viewhtmlcontent324.aspx

Второе редактирование, я провел некоторые исследования и тестирование, и возможно использовать материал web.config ASP.NET по умолчанию, использовать <location path="~/Sales/Index"> вместо <location path="~/Views/Sales/Index.aspx">

НО

Вы должны быть действительно очень осторожны, если есть несколько URL, которые могут попасть на одну и ту же страницу, например /, /Home, /Home/, /Home/Index и т. Д. - вы выиграли 't получить настройки авторизации на всех из них автоматически. Я думаю, что гораздо безопаснее использовать что-то, поддерживающее MVC, например атрибут [Authorize] или пользовательскую схему, с которой я связан выше.

...