我在使用Windows身份验证的MVC4应用程序中添加了Authorise attribute,在测试时我更改了活动目录组的名称,以检查Global.asax类中的Application_Error
方法是否会捕获非授权用户。
问题是未捕获异常并且IIS表示抛出401异常。是否可以捕获这些类型的授权异常,如果有更好的方法来处理MVC应用程序中的异常?
方式
全球性的asax
protected void Application_Error()
{
System.Diagnostics.Debugger.Break();
}
IIS表示抛出401未经授权的例外
工作验证
使用此方法有效,但有点乱。
if (User.IsInRole(@"DOMAIN\USER"))
{
if (ModelState.IsValid)
{
ctx.SaveChanges(model);
ViewBag.Notification = "Save Successful";
}
}
else
{
throw new HttpException(404, "Category not found");
}
答案 0 :(得分:3)
经过进一步研究后,我在Michael Mckenna和Part1找到了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源代码的链接,因此您可以查看它的作用: