2009-09-24 67 views
5

我在我的ASP.NET MVC控制器上使用自定義授權篩選器,如果用戶在特定操作上未通過授權,則會將用戶重定向到登錄屏幕以外的其他URL。如何處理返回ViewResult以外結果的操作的授權?

這對返回視圖的操作是可以的,但我的許多操作返回其他結果類型,如PartialResult或JsonResult。

我現在的過濾器看起來像這樣:

< AuthorizeWithRedirect(角色:= 「ServerAccess」,控制器:= 「家」,動作:= 「未經授權」)>

這表明如果用戶不在ServerAccess角色那麼他們應該被重定向到/家/未經授權/

我很好奇其他人如何處理這個?當您考慮只打算由客戶端腳本AJAX調用調用的操作數時,這看起來特別有問題。/Home/Unauthorized/action如何知道調用者是否打算接收視圖,partialview,json,內容等?

回答

1

我想你需要通過重定向傳遞這些信息。

幾種方法,你可以處理這個問題:

  • 考慮制定單獨的行動方法爲每個需要類型的響應 - UnauthorizedJson,UnauthorizedHtml,UnauthorizedEtc ......這相當於原來的操作響應類型

  • 通與重定向的格式信息通過添加另一個參數,未經授權方法並在過濾器上,追加到URL

+0

第一個選項是我現在採用的路線,每個ActionResult類型都有一個控制器動作,即UnauthorisedPartial,UnauthorisedJSON。它允許我編寫一個標準頁面並將其返回給任何調用者。 – Nick 2009-09-25 08:44:08

9

使用Request.IsAjaxRequest(),例如:

public sealed class AjaxAuthorizeAttribute : AuthorizeAttribute 
{ 
    public AjaxAuthorizeAttribute() : base() 
    { 
    } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     // Extends the original Web.MVC.AuthorizeAttribute for Ajax calls. 
     // Basically if the request is not authorized and the request is an AJAX Request. 
     // then we simply set the stats Code to 403 and set an empty Result, in order to 
     // determine in Javascript if the AJAX call came back completed and valid. 
     base.OnAuthorization(filterContext); 
     if (filterContext.Result == null) 
     { 
      return; 
     } 
     else if (filterContext.Result.GetType() == typeof(HttpUnauthorizedResult) 
       && filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      filterContext.Result = new ContentResult(); 
      filterContext.HttpContext.Response.StatusCode = 403; 
     } 
    } 
} 

注403,而不是401,因爲ASP.NET攔截401S並將其轉換爲HTML錯誤頁面。 AJAX調用預期接收的內容無關緊要;它仍然可以看到狀態碼。

+0

返回403是一個我沒有考慮過的有趣的方法。我想這會把責任放在客戶端腳本上,以便爲用戶生成適當的消息。 – Nick 2009-09-25 08:41:24

+0

無論你如何做,這個負責人總是和AJAX一起出現。 – 2009-09-25 12:52:56

相關問題