从MVC4中的Authorize属性捕获异常

时间:2014-01-23 14:31:24

标签: c# asp.net-mvc asp.net-mvc-4 exception

我在使用Windows身份验证的MVC4应用程序中添加了Authorise attribute,在测试时我更改了活动目录组的名称,以检查Global.asax类中的Application_Error方法是否会捕获非授权用户。

问题是未捕获异常并且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");
}

2 个答案:

答案 0 :(得分:3)

经过进一步研究后,我在Michael MckennaPart1找到了Part2的几篇博文,详细介绍了他的异常处理策略,我必须通过手动测试来完成用户是在活动目录组中,如果没有抛出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();
            }

        }
    }

答案 1 :(得分:1)

我认为AuthorizeAttribute在遇到未经授权的请求时不会抛出任何异常。它只是将401响应发送给客户端。

如果您想要其他事情发生,您可以从AuthorizeAttribute类继承并覆盖HandleUnauthorizedRequest - 方法。如果你想抛出异常,你可以从那里抛出它。

public class ThrowingAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        throw new HttpException(401, "Unauthorized");
    }
}

这是AuthorizeAttribute源代码的链接,因此您可以查看它的作用: