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