Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从MVC4中的Authorize属性捕获异常_C#_Asp.net Mvc_Asp.net Mvc 4_Exception - Fatal编程技术网

C# 从MVC4中的Authorize属性捕获异常

C# 从MVC4中的Authorize属性捕获异常,c#,asp.net-mvc,asp.net-mvc-4,exception,C#,Asp.net Mvc,Asp.net Mvc 4,Exception,我已使用Windows身份验证在我的MVC4应用程序中添加了,在测试时,我更改了active directory组的名称,以检查Global.asax类中的application_Error方法是否会捕获未经授权的用户 问题是没有捕获异常,IIS express会抛出401异常。是否可以捕获这些类型的授权异常,如果可以,是否有更好的方法来处理MVC应用程序中的异常 方法 全球asax IIS express引发401未经授权的异常 工作验证 使用这种方法是可行的,但有点混乱 if (User.I

我已使用Windows身份验证在我的MVC4应用程序中添加了,在测试时,我更改了active directory组的名称,以检查Global.asax类中的application_Error方法是否会捕获未经授权的用户

问题是没有捕获异常,IIS express会抛出401异常。是否可以捕获这些类型的授权异常,如果可以,是否有更好的方法来处理MVC应用程序中的异常

方法

全球asax

IIS express引发401未经授权的异常

工作验证

使用这种方法是可行的,但有点混乱

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

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

如果希望发生其他事情,可以从类继承并重写-方法。如果希望抛出异常,可以从那里抛出

public class ThrowingAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        throw new HttpException(401, "Unauthorized");
    }
}
以下是AuthorizeAttribute源代码的链接,因此您可以检查它的功能:


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

如果希望发生其他事情,可以从类继承并重写-方法。如果希望抛出异常,可以从那里抛出

public class ThrowingAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        throw new HttpException(401, "Unauthorized");
    }
}
以下是AuthorizeAttribute源代码的链接,因此您可以检查它的功能:


在进一步研究之后,我发现了几篇来自in的博客文章,他详细介绍了他的异常处理策略,我通过手动测试用户是否在active directory组中,如果没有抛出异常,则必须执行该策略

这解决了问题,但在使用

Global.asax

误差控制器


在进一步研究之后,我发现了几篇来自in的博客文章,他详细介绍了他的异常处理策略,我通过手动测试用户是否在active directory组中,如果没有抛出异常,则必须执行该策略

这解决了问题,但在使用

Global.asax

误差控制器


默认的Authorize属性不会引发任何异常。但正如我在回答中所说,您可以轻松实现AuthorizeAttribute的自定义版本,只需从HandleUnauthorizedRequest-method抛出所需的HTTPException。如果我假设“HandleUnauthorizedRequest”方法,特别是“actionContext.ControllerContext.Request.CreateErrorResponse”行在响应中包装异常。浏览器在响应头中捕获的。这些方法只向浏览器发送401状态代码。它们不会抛出任何可以在全局错误处理程序中处理的异常。我已经修改了我的答案,添加了一个自定义授权属性的示例,该属性会引发必要的异常。new part2链接:默认授权属性不会引发任何异常。但正如我在回答中所说,您可以轻松实现AuthorizeAttribute的自定义版本,只需从HandleUnauthorizedRequest-method抛出所需的HTTPException。如果我假设“HandleUnauthorizedRequest”方法,特别是“actionContext.ControllerContext.Request.CreateErrorResponse”行在响应中包装异常。浏览器在响应头中捕获的。这些方法只向浏览器发送401状态代码。它们不会抛出任何可以在全局错误处理程序中处理的异常。我修改了答案,加入了一个自定义授权属性的示例,该属性会引发必要的异常。新建第2部分链接:
 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();
            }

        }
    }