2010-10-06 73 views
4


我有一個ASP.MVC 2網頁,我有我的認證做過這樣的:授權在ASP.NET MVC 2使用web.config文件

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); 

現在我想設置我的網站.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> 

...但是這工作。

我在做什麼錯?

回答

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">

你必須非常非常小心,如果有可能降落在你在同一個頁面上有多個URL,例如//Home,/Home/,/Home/Index等 - 您將不會自動獲取所有這些授權設置。我認爲使用MVC感知的東西要更安全一些,比如[Authorize]屬性,或者我上面鏈接的定製方案。

+0

是的我知道,但更改web.config文件更容易,而不是更改代碼。 – dani 2010-10-06 06:22:22

+0

謝謝喬恩,我會嘗試你的鏈接。 – dani 2010-10-06 06:30:58

6

停止。如果您嘗試在Web.config中使用<位置>來確保MVC應用程序的安全,那麼您將面臨最困難的情況,最糟糕的情況是在應用程序中打開一個巨大的安全漏洞。

正如喬恩所說的,使用[Authorize]或其他正確掛接MVC管道(無論是聲明式還是編程式)的事情是只有這樣做的正確方法。產品團隊在http://blogs.msdn.com/b/rickandy/archive/2010/08/24/securing-your-mvc-application.aspx上詳細討論了此問題。