使用web.config文件在ASP.NET MVC 2中进行授权

时间:2010-10-06 06:12:27

标签: asp.net-mvc-2 authentication web-config authorization


我有一个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 个答案:

答案 0 :(得分:6)

停止。如果您尝试使用&lt; location&gt;在Web.config中保护MVC应用程序,你最好让自己的生活变得困难,最糟糕的是在你的应用程序中打开一个巨大的安全漏洞。

正如Jon提到的那样,使用[Authorize]或其他正确挂钩MVC管道(无论是声明性还是程序性)的东西是唯一正确的方法。产品团队会在http://blogs.msdn.com/b/rickandy/archive/2010/08/24/securing-your-mvc-application.aspx详细了解此问题。

答案 1 :(得分:3)

[Authorize]属性放在控制器操作上要容易得多:

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

您也可以将该属性放在控制器上,而不必将其放在每个操作方法上......

编辑以回应您的评论:我不知道可以原生使用XML,但请查看http://www.jigar.net/articles/viewhtmlcontent324.aspx

第二次编辑,我做了一些研究和测试,可以使用默认的ASP.NET web.config内容,使用<location path="~/Sales/Index">而不是<location path="~/Views/Sales/Index.aspx">

<强> BUT

如果有多个网址可以让您登陆同一页面,那么您必须非常小心,例如//Home/Home//Home/Index等等 - 您不会自动获取所有这些授权设置。我认为使用MVC感知的东西更安全,例如[Authorize]属性或我上面链接的自定义方案。