我有一个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>
...但不有效。
我做错了什么?
答案 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]
属性或我上面链接的自定义方案。