2013-03-04 78 views
19

在我的.NET MVC 4我添加一個全局過濾器,以保護我的控制器。 這是用做:ASP.net MVC 4全球授權過濾器強制登錄的AllowAnonymous行動

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new System.Web.Mvc.AuthorizeAttribute()); 
} 

這是從我的Global.cs類調用。

我的web.config文件中包含一個標準配置:

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" /> 
</authentication> 

我的登錄動作,以允許匿名用戶登錄飾[AllowAnonymous]

到目前爲止好,一切都很好。這裏是我的登陸行動:

[AllowAnonymous] 
public ActionResult Login(string returnUrl) 
{ 
    ViewBag.ReturnUrl = returnUrl; 
    return View(); 
} 

現在,我想補充這也就像登錄頁面應提供給匿名用戶重置密碼的頁面。我創造了我的行動(的登錄操作同一控制下),並與[AllowAnonymous]裝修裝飾它:

[AllowAnonymous] 
public ActionResult ResetPasswordForUser(string message = "") 
{ 
    ViewBag.message = message; 
    return View(); 
} 

然後創建相應的視圖。

我加入這個鏈接到我的登錄頁面:

@Html.ActionLink("Forgot your password?", "ResetPasswordForUser", "Account") 

在運行時,我用我得到的ResetPasswordForUser操作的匿名用戶點擊該鏈接,但返回視圖時登錄動作被調用我永遠無法真正達到理想的視野。出於某種原因,即使我使用[AllowAnonymous]裝飾,我的請求也會被攔截。

我在這裏錯過了什麼嗎?

在此先感謝

UPDATE1:

按照達林季米特洛夫要求加入我的ResetPasswordForUser觀點:

@using TBS.Models 
@model TBS.ViewModels.ResetPasswordForUserViewModel 

@{ 
    ViewBag.Title = "Reset Password"; 
} 

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 

    <table class="edit-table rounded bordered" style="width: 400px"> 
     <tr> 
      <td class="label-td"> 
       @Html.LabelFor(m => m.Username) 
      </td> 
      <td> 

       @Html.TextBoxFor(m => m.Username) 
       @Html.ValidationMessageFor(model => model.Username) 
      </td> 
     </tr> 
     <tr> 
      <td class="label-td"> 
       @Html.LabelFor(m => m.Password) 
      </td> 
      <td> 
       @Html.Password("Password") 
       @Html.ValidationMessageFor(model => model.Password) 
      </td> 
     </tr> 
     <tr> 
      <td colspan="2" style="text-align: center"> 
       <input type="submit" value="Reset" /> 
      </td> 
     </tr> 
    </table> 
} 
+0

是否有配置一個<授權>部分?如果是這樣,那可能會干擾MVC的授權機制。 – Levi 2013-03-04 16:49:00

+0

我的Web.config文件包含 forhas 2013-03-04 18:59:44

+4

您粘貼部分,而不是<授權>部分。後者會導致問題。此外,請確保您使用System.Web.Mvc.AllowAnonymousAttribute而不是System.Web.Http命名空間中的一個。 – Levi 2013-03-05 16:28:28

回答

10

ResetPasswordForUser視圖使用的_Layout文件是否有可能在您的控制器(例如,在菜單中)中調用了一個尚未用AllowAnonymous修飾的Action?

這將導致這種類型的行爲。

+0

您是第一個提供此答案的人,謝謝! – forhas 2013-04-02 15:20:10

3

這聽起來像你可以有一個非匿名@ Html.Action或Html.RenderAction在您的佈局,這是導致您的網頁重定向到登錄。

編輯:刪除舊的答案,因爲它是不正確的,沒有任何人來看它。

+0

謝謝丹。我也很驚訝,我沒有得到答案。我基於我的解決方案:http://www.davidhayden.me/blog/asp.net-mvc-4-allowanonymous-attribute-and-authorize-attribute。這是因爲我想省去爲每個控制器添加[授權]裝飾的需求,我認爲這很基礎。根據你的說法,我必須爲我的每一個控制器裝備這種裝飾(假設他們都需要授權用戶)?它可能工作,但肯定聽起來像是我的開銷。 – forhas 2013-03-18 14:36:51

+0

好吧,還有一個解決方案,創建您自己的基礎控制器並添加屬性。當然,您仍然需要爲每個控制器添加BaseController,但擁有自己的基本控制器無論如何都是不錯的做法。 – 2013-03-18 14:50:38

+0

好的,我一直在玩這個,我的答案可能是錯的。有一個問題,當你去登錄時,url是否有returnUrl,或者它只是/ Controller/Login? – 2013-03-18 15:25:02

1

我不知道是否添加全局授權過濾器與AllowAnonymous發生衝突。我設置項目的方式是讓一個基本控制器在控制器級別設置[授權]屬性。

我的所有控制器都從這個BaseController繼承,除了那些需要匿名訪問的控制器,通常是我的AccountController和我的MarketingController。那些只是從Controller繼承,然後我可以在Action級別設置[Authorize]。