首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NWebsec.Core.Exceptions.RedirectValidationException后如何重定向到误差控制器

NWebsec.Core.Exceptions.RedirectValidationException后如何重定向到误差控制器
EN

Stack Overflow用户
提问于 2015-01-22 11:00:34
回答 2查看 617关注 0票数 0

我有ASP.NET MVC 5应用程序,但不管它是MVC 3,4还是不重要。我已经安装了NWebSec 3.0模块,并启用了重定向验证。我有Application_Error方法(即使我没有方法,问题也是一样的!):

代码语言:javascript
复制
    protected void Application_Error(object sender, EventArgs e)
    {
        HttpContext httpContext = ((MvcApplication)sender).Context;
        Exception exception = Server.GetLastError();
        if(exception is NWebsec.Core.Exceptions.RedirectValidationException)
        {
            Trace.WriteLine("How to redirect from here to ErrorController/Index?");
        }
        else
        {
            Trace.WriteLine("How to redirect from here to ErrorController/Index?");

Herer是HomeControllers中的两种测试方法:

代码语言:javascript
复制
    public ActionResult Redirect()
    {
        return new RedirectResult("http://www.deshow.net/d/file/travel/2010-04/bing-landscape-wallpaper-845-2.jpg");
    }

    public ActionResult ParseError()
    {
        int.Parse("test");
        return View();
    }

我有标准的共享错误视图

代码语言:javascript
复制
 <customErrors mode="On" defaultRedirect="~/Error" />

已启用。

我希望无论发生什么错误,我都会被重定向到错误视图。但是,当我调用重定向方法时,情况并非如此。当抛出重定向错误时,将绕过标准的“自定义错误”机制,而不显示标准错误视图。

另一个细节是,在ParseError()被击中之后,Application_Error没有被击中,并且显示了标准的“自定义错误”视图,但是当重定向()被击中时,没有“自定义错误”视图,只有黄色的死亡屏幕。这让我想,也许我没有正确理解http模块的“管道”。

NWebsec.Core.Exceptions.RedirectValidationException.与重定向错误的NWebSec相交并抛出我想是因为NwebSec被注册为一个模块。

代码语言:javascript
复制
    <system.webServer>
    <modules>
      ...
    <add name="NWebsecHttpHeaderSecurityModule" type="NWebsec.Modules.HttpHeaderSecurityModule, NWebsec, Version=3.2.0.0, Culture=neutral, PublicKeyToken=3613da5f958908a1" />
    ...
    </modules>
    </system.webServer>

我已经读过这个-E-E-E-E-s的答案了,但我想不出来。您能给我指出这样一个问题的答案或提供示例实现吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-23 16:24:37

假设您在一个RedirectValidation上有一个ErrorsController操作,这样的操作应该可以工作:

代码语言:javascript
复制
protected void Application_Error(object sender, EventArgs e)
{
    var routeData = new RouteData();
    routeData.Values["controller"] = "error";

    var exception = Server.GetLastError();

    if(exception is NWebsec.Core.Exceptions.RedirectValidationException)
    {
        routeData.Values["action"] = "redirectvalidation";
    }
    else
    {
        // handle everything else
    }

    Response.Clear();
    Server.ClearError();

    // Avoid IIS7 getting in the middle
    Response.TrySkipIisCustomErrors = true;

    IController errorsController = new Controllers.ErrorController();
    HttpContextBase wrapper = new HttpContextWrapper(Context);

    var rc = new RequestContext(wrapper, routeData);
    errorsController.Execute(rc);
}

这基本上和你的一个链接答案所做的事情是一样的,只不过你处理的是非常特定类型的异常。我做了一些类似的例外,因为超出了我们的上传大小限制。

票数 1
EN

Stack Overflow用户

发布于 2015-01-23 14:09:43

我遇到了同样的问题。文档解释说,3.x版本在重定向时有点机会主义。因此,您必须将已批准的url重定向(也允许自定义端口)进行白名单。

在您的配置中,更新allowSameHostRedirectsToHttps节点。

代码语言:javascript
复制
<redirectValidation enabled="true">
  <allowSameHostRedirectsToHttps enabled="true" />
  <!--<allowSameHostRedirectsToHttps enabled="true" httpsPorts="4567, 7654"/>-->
  <add allowedDestination="http://www.nwebsec.com/"/>
  <add allowedDestination="https://www.google.com/accounts/"/>
</redirectValidation>

此错误可能是由于在发送标头之前抛出的错误而引发的。文档说,如果您想绕过Response.Flush()处理您自己的自定义错误,可以调用它()。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28087103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档