2012-08-31 31 views
1

我有一個自定義屬性,用於Ajax請求以防止默認的FormsAuthentication工作流發生(因爲它對Ajax請求沒有意義)。授權屬性讓ActionResult代碼執行

這是自定義授權屬性:

public class AjaxAuthorize : AuthorizeAttribute { 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { 
     UrlHelper urlHelper; 

     if (filterContext.HttpContext.Request.IsAjaxRequest()) { 
      urlHelper = new UrlHelper(filterContext.RequestContext); 

      filterContext.HttpContext.Response.StatusCode = 401; 
      //Don't let IIS7 be mean. 
      filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
      //Return JSON which tells the client where the login page exists if the user wants to authenticate. 
      filterContext.HttpContext.Response.Write(new JavaScriptSerializer().Serialize(
       new { 
        LoginUrl = string.Format("{0}?ReturnURL={1}", FormsAuthentication.LoginUrl, urlHelper.Encode(filterContext.HttpContext.Request.Url.PathAndQuery)) 
       } 
      )); 
      filterContext.HttpContext.Response.End(); 
     } else { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 
} 

我有我的ActionResult飾以自定義授權屬性,像這樣:

[HttpPut] 
[ValidateInput(false)] 
[AjaxAuthorize] 
public ActionResult Comment(string id, string comment) { 
    //stuff happens here. 
} 

一個例外是我行動的結果裏面扔,因爲我嘗試訪問有關用戶的信息,只有當您登錄時纔會存在。但是,我不明白爲什麼此代碼甚至被執行,因爲我的授權屬性保護了該操作。

回答

1

我最終返回了一個HTTP 418(我一直想使用它一段時間),以便Forms Authentication模塊不會攔截請求。然後在我的腳本中查找狀態碼,並將其作爲未經授權的請求處理,並進行適當的重定向。

+0

我使用了419身份驗證超時(不在RFC 2616中)。這有助於我走上正軌。 – GameSalutes

0

嘗試在IF塊內調用base.HandleUnauthorizedRequest(filterContext);。或者只是刪除ELSE塊並始終呼叫base.HandleUnauthorizedRequest(filterContext);

+0

這沒有辦法。 –

+0

這不是您可能要查找的答案,但我會嘗試再次啓動此方法,只調用基本方法,然後逐步調試並添加代碼以確定哪個命令導致其失敗。 – AndreCruz

1

這是HandleUnauthorizedRequest的默認實現。可能你需要分配包含你需要的JSON的自定義ActionResult和有效的狀態碼。我不確定HTTP上下文中的直接處理請求對象是否有效。

+0

由於用戶未經過身份驗證,現有的'AuthorizeCore'已經返回false。 –

+0

對不起,答案已編輯。以前的答案版本包含假設AuthorizeCode方法返回true。 – STO

+0

如何停止表單身份驗證模塊踢入?我只想返回JSON,而不是重定向到登錄頁面。 –