2

私は素敵な MVC4 アプリケーションを構築し、それを保護することに決めました。すべて問題ありません。以下は、例として XSS 攻撃を防ぐために使用するフィルターです。

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 がインストールされており、うまく機能します。

問題は、私は上記のエラーについて知っており、例外メッセージを表示したり、ログに記録したりしたくないということです (これらはすべて簡単に実行できます)。代わりに、ユーザーに素敵な小さなメッセージを表示することで、適切に処理したいと考えています。上記のコードを変更して、ビューまたは部分ビューを素敵な小さなメッセージとともに表示したり、どこかにテキストを出力して、アプリケーションがクラッシュしないような適切な方法で何が問題なのかをユーザーに知らせるにはどうすればよいですか? 、おそらくこの特定のケースでは、彼を正しいログイン画面に戻します。

4

1 に答える 1

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割り当てたがすぐに実行されます。基本的に、アクションの実行を短絡しています。必要な ActionResult を返すことができます: ViewResult、PartialViewResult、JsonResult、RedirectToRouteResult など。ResultfilterContext

于 2013-01-31T12:03:08.480 に答える