2014-10-28 90 views
18

我創建了一個全新的ASP.NET MVC 5項目,FormsAuthentication.SetAuthCookie測試[Authorize]屬性。我簡單地設置一個cookie中的一個動作(在我的家庭控制器):FormsAuthentication.SetAuthCookie不[授權]在MVC 5

public ActionResult About() 
    { 
     FormsAuthentication.SetAuthCookie("someUser", false); 

我限制進入另一個:

[Authorize] 
    public ActionResult Contact() 
    { 

當我啓動我的網頁,並導航到/home/contact,我是正確的重定向到登錄頁面。然後我去/home/about,拿到我的cookie,然後回到聯繫頁面。但我仍然被重定向到登錄頁面 - 該cookie不認證/授權我。

在調試器中,當我多次加載關於頁面時(也就是說,即使在設置auth cookie之後,它從來沒有認爲我已經被認證),它就是HttpContext.User.Identity.IsAuthenticated == false

是否有必須在這裏做了一些額外的步驟?我不應該爲自己的基本身份驗證設置自己的IPrincipal,是嗎?

+5

MVC5不再使用表單身份驗證,請檢查您的web.config中的 。如果你想使用它,請按照這篇文章,你可以使用owin來處理它。 http://blogs.msdn.com/b/webdev/archive/2013/07/03/understanding-owin-forms-authentication-in-mvc-5.aspx – DSR 2014-10-28 16:37:54

+1

經過對OWIN的一些研究,似乎這是更好的選項,看看微軟如何朝着MVC 6的方向前進。我使用[無數據庫的ASP.NET身份](https://github.com/leeenglestone/ASP.NET-Identity-Without-a-Database)作爲一個如何驗證和授權的例子。這比一個簡單的'SetAuthCookie'複雜得多,但它似乎更具前瞻性。 – user655321 2014-10-29 16:49:03

+1

男人,這是一堆doo doo。爲什麼微軟會這麼做? – Hill 2016-02-04 06:33:39

回答

9

編輯:我不知道MVC5默認已刪除表單身份驗證(該模塊被刪除)的新項目,所以請確保您也檢查DSR的評論下你原來的帖子與所有這一切連在一起。

檢查你的web.config,尋找鑑別部分,它應該是這個樣子,

<authentication mode="Forms"> 
    <forms loginUrl="..." cookieless="UseCookies" /> 
</authentication> 

http://msdn.microsoft.com/en-us/library/1d3t3c61%28v=vs.85%29.aspx

默認cookie的值是「UseDeviceProfile」,這意味着,Cookie是如果使用瀏覽器報告它支持餅乾,否則不使用Cookie和它使用在查詢字符串值維持認證狀態(其需要保留翻過回發)。

其次,確保cookies在你的瀏覽器。如果該設備/瀏覽器不支持cookie或者被關閉,然後將SetAuthCookie更改網址,但你必須將呼叫重定向到使用SetAuthCookie後的瀏覽器...

FormsAuthentication.RedirectFromLoginPage(String, Boolean)... 

這種方法重定向頁面到使用SetAuthCookie進行身份驗證後的目標。 RedirectFromLoginPage將在url查詢中放入必要的屬性,以保持跨回發的登錄會話。如果你在網站上自己的重定向在這裏和那裏,你將需要如果當前用戶與HttpContext.Current.User.Identity.IsAuthenticated認證檢查,以保持該網址查詢參數翻過回傳你的自我。

爲了用戶發送到登錄頁面,你應該使用

FormsAuthentication.RedirectToLoginPage() 

這種方法會RETURNURL參數添加到查詢字符串,其後來的功能「RedirectFromLoginPage」將被後回重定向到認證。

如果你阻止訪問用戶或角色與位置的元素在你的web.config路徑和資源窗體身份驗證自動處理重定向到登錄頁面,當一個沒有認證的用戶嘗試訪問它們。

<location path="SomeFolderOnYourSite"> 
    <system.web> 
     <authorization> 
     <deny users="?"/> 
     <allow roles="Administrators"/> 
     </authorization> 
    </system.web> 
    </location> 
43

從web.config中刪除:

<modules> 
    <!--<remove name="FormsAuthenticationModule" />--> 
</modules> 

或simples刪除線 在web.config中

+4

拯救了我的生命和幾乎浪費了幾個小時......謝謝! – Flea 2016-01-30 22:05:01

+4

在我的情況下,這是'' – Keith 2016-03-14 21:20:02

+2

爲什麼這不被標記爲正確答案?保存我的生活:) – Koshera 2016-04-28 21:27:43

0
<location path="SomeFolderOnYourSite"> 
<system.web> 
    <authorization> 
    <deny users="?"/> 
    <allow roles="Administrators"/> 
    </authorization> 
</system.web> 

就像它不是爲我工作的時候我使用相同的代碼與小改變它的工作**<location path="~/SomeFolderOnYourSite"> <system.web> <authorization> <deny users="?"/> <allow roles="Administrators"/> </authorization> </system.web> </location>**