2014-01-23 96 views
2

我在使用Windows身份驗證的MVC4應用程序中添加了Authorise attribute,並在測試時更改了活動目錄組的名稱,以檢查Global.asax類中的Application_Error方法是否會捕獲非授權用戶。捕獲MVC4中Authorize屬性的異常

問題是沒有捕獲到異常,並且IIS高速緩存會引發401異常。是否可以捕獲這些類型的授權異常,如果有的話,是否有更好的方法來處理MVC應用程序中的異常?

方法

enter image description here

全球ASAX

protected void Application_Error() 
{ 
    System.Diagnostics.Debugger.Break(); 
} 

IIS表達拋出401未授權異常

enter image description here

工作驗證

使用這種方法的作品,但它有點混亂。

if (User.IsInRole(@"DOMAIN\USER")) 
{ 
    if (ModelState.IsValid) 
    { 
     ctx.SaveChanges(model); 
     ViewBag.Notification = "Save Successful"; 
    } 
} 
else 
{ 
    throw new HttpException(404, "Category not found"); 
} 

回答

3

經過進一步的研究,我在Part1發現一對夫婦的博客文章從Michael MckennaPart2他詳細介紹了他的異常處理策略,我必須通過手動測試工作是一個用戶在一個活動目錄組中,如果不是將一個HTTPException

這得到解決此問題,但仍然沒有捕捉到任何異常,使用AuthorizeAttribute

的Global.asax

protected void Application_Error() 
    { 
     var exception = Server.GetLastError(); 
     Server.ClearError(); 
     var httpException = exception as HttpException; 

     //Logging goes here 

     var routeData = new RouteData(); 
     routeData.Values["controller"] = "Error"; 
     routeData.Values["action"] = "Index"; 

     if (httpException != null) 
     { 
      switch(httpException.GetHttpCode()) 
      { 
       case 401: 
        routeData.Values["action"] = "NotAuthorised"; 
        break; 
       case 402: 
       case 403: 
        routeData.Values["action"] = "NotAuthorised"; 
        break; 
       case 404: 
        routeData.Values["action"] = "NotFound"; 
        break; 
      } 

      Response.StatusCode = httpException.GetHttpCode(); 
     } 
     else 
     { 
      Response.StatusCode = 500; 
     } 

     // Avoid IIS7 getting involved 
     Response.TrySkipIisCustomErrors = true; 

     // Execute the error controller 
     IController errorsController = new Jmp.StaticMeasures.Controllers.ErrorController(); 
     HttpContextWrapper wrapper = new HttpContextWrapper(Context); 
     var rc = new RequestContext(wrapper, routeData); 
     errorsController.Execute(rc); 
    } 

差錯控制

using System.Web.Mvc; 

    namespace Jmp.StaticMeasures.Controllers 
    { 
     public class ErrorController : Controller 
     { 
      public ActionResult Index() 
      { 
       return View(); 
      } 

      public ActionResult NotFound() 
      { 
       return View(); 
      } 

      public ActionResult NotAuthorised() 
      { 
       return View(); 
      } 

     } 
    } 
+0

默認批准─當屬性不會拋出任何異常。但正如我在我的回答中所建議的那樣,您可以輕鬆實現AuthorizeAttribute的自定義版本,並從HandleUnauthorizedRequest方法中引發所需的HTTPException。 – artokai

+0

如果我假設'HandleUnauthorizedRequest'方法,特別是'actionContext.ControllerContext.Request.CreateErrorResponse'行確實包含響應中的異常。瀏覽器在響應頭中捕獲的內容。 –

+0

這些方法只是將401狀態碼發送到瀏覽器。他們不會拋出任何可以在全局錯誤處理程序中處理的異常。我修改了我的答案,以包含引發必要異常的自定義授權屬性的示例。 – artokai

1

我不認爲AuthorizeAttribute在遇到未經授權的請求時拋出任何異常。它只是將401響應發送給客戶端。

如果您想要發生其他情況,您可以繼承AuthorizeAttribute類並覆蓋HandleUnauthorizedRequest-方法。如果你想拋出一個異常,你可以從那裏拋出異常。

​​

這裏給AuthorizeAttribute源代碼的鏈接,這樣你就可以檢查它做什麼: