2013-01-31 49 views
2

我已经构建了一个不错的MVC4应用程序,决定保护它并且一切正常。下面是我用来帮助防止XSS攻击的一个例子。在ASP.NET MVC 4应用程序中安装Elmah的异常处理

public class IsPostedFromThisSiteAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     //TODO: - Possible problems in future: 
     //1. Is there a way to handle the execptions and just display a friendly error page/message. 

     if (filterContext.HttpContext != null) 
     { 
      if (filterContext.HttpContext.Request.UrlReferrer == null) 
       throw new System.Web.HttpException("Invalid Submission"); 

      //if (filterContext.HttpContext.Request.UrlReferrer.Host != "localhost/YeatsClinical.PatientPortal.Web") 
      if (filterContext.HttpContext.Request.UrlReferrer.AbsolutePath != ConfigurationManager.AppSettings["SiteURL"]) 
       throw new System.Web.HttpException("This form was not submitted from this site!"); 
     } 
    } 
} 

我的MVC应用程序安装了Elmah,它也很棒。

问题是,我知道上面的错误,我不想显示一个异常消息,或记录它或类似的东西(所有我可以轻松做到这一点)。相反,我想通过向用户显示一个很好的小消息来正确处理它。我怎样才能改变上面的代码,以允许它显示一个很好的小消息的视图或部分视图,或者只是在某处输出一些文本,让用户知道什么地方出错了,而不会导致应用程序崩溃,也许在这种特殊情况下,将他返回到正确的登录屏幕。

回答

2

刚分配Result财产上filterContext

public class IsPostedFromThisSiteAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     //TODO: - Possible problems in future: 
     //1. Is there a way to handle the execptions and just display a friendly error page/message. 

     if (filterContext.HttpContext != null) 
     { 
      if (filterContext.HttpContext.Request.UrlReferrer == null) 
      { 
       var viewResult = new ViewResult 
       { 
        ViewName = "~/Views/Shared/Invalid.cshtml" 
       }; 
       filterContext.Result = viewResult; 
       return; 
      } 

      if (filterContext.HttpContext.Request.UrlReferrer.AbsolutePath != ConfigurationManager.AppSettings["SiteURL"]) 
      { 
       var viewResult = new ViewResult 
       { 
        ViewName = "~/Views/Shared/InvalidSite.cshtml" 
       }; 
       filterContext.Result = viewResult; 
       return; 
      } 
     } 
    } 
} 

这样可以防止被执行的控制行动,并会立即执行ActionResult已分配给filterContextResult财产。基本上你是短暂的行动的执行。你可以返回任何你想要的ActionResult:ViewResult,PartialViewResult,JsonResult,RedirectToRouteResult,...

+0

谢谢你的回答。我遇到了一个错误,但它没有与此代码相关,这与我的登录页面有关,而且我得到的错误不属于问题的一部分。我做了一个示例项目,并使用你的代码来验证它的工作原理。所以,我会接受你的答案,并再次感谢你的帮助。 –