查找ASP.NET重定向原因?

6
我试图在web.config中添加一个例外,以便一个页面不需要身份验证。然而,它仍然重定向到登录页面。
问题不在于如何设置web.config。为什么?我们的系统(不管好坏)除了web.config之外还有许多工具。我们有global.asax和自定义HttpHandlers。代码库不是很大,但有许多可能导致重定向的原因。
我想知道的是如何最好地确定重定向的原因。是否有一种方法可以找出触发重定向的代码?

你是在试图解决一个错误还是只是想知道执行过程如何到达登录页面的便利性? - Kev
6个回答

4
如果您能够调试应用程序,从global.asax中的HttpApplication.BeginRequest开始,并通过System.Web's reference source进行步进,这将是一种蛮力方法。
或者,在HttpResponse.Redirect(string, bool)上设置断点并跟随调用堆栈——我怀疑运行时使用的其他方式来重定向请求。
如果这没有找到任何问题(或者您无法调试),并且由于蛮力方法很可能会经过很多代码——而且似乎您的问题与安全有关——您可能只需挂接HttpApplication。AuthenticateRequest和HttpApplication。AuthorizeRequest(以及它的相关Post*事件),看看那里的情况如何。
如果您正在使用表单身份验证,我碰巧知道FormsAuthenticationModule在HttpApplication.EndRequest处查找401状态代码,以决定是否重定向请求。任何设置401(访问被拒绝)的内容都将导致重定向——而不是将401返回给浏览器。

1
此外,如果这只发生在您的生产应用程序中,您可以使用WinDBG找出问题所在。按照this article的步骤进行操作:
  • 启动WinDBG并附加到w3wp进程
  • WinDBG将断点,因此执行.loadby sos mscorwks以加载SOS模块
  • 键入sxe clr以在CLR异常上断点
  • 键入g以继续执行
现在,您的应用程序将在任何异常上中断。由于Response.Redirect通常会引发ThreadAbortException,因此这可能是一种简单的方法来中断。然后执行!printexception以获取堆栈跟踪。如果我的WinDBG foo没有失败,您还可以执行~*e!clrstack以查看当前正在执行的所有线程的托管堆栈。
请注意,在中断期间,您会冻结w3wp进程,因此要快速操作!

希望你可以使用其他方法,但如果一切都失败了,这可能会帮助你入门。


1
当请求一个需要身份认证的asp.net页面时,asp.net默认会重定向到指定的登录页面并提供一个ReturnUrl查询字符串参数,默认情况下,该参数标识了原始请求的页面。虽然可以配置这个ReturnUrl,但是如果您没有修改配置,则其存在应表明身份验证失败。
在这种情况下,您应该专注于排除页面身份验证设置的问题。Gordon Bell 的回答看起来很不错。
<system.web>
...
</system.web>

<location path="NoAuthNeeded.aspx">
    <system.web>
        <authorization>
        <allow roles="*" />
        <allow roles="?" />
        </authorization>
    </system.web>
</location>

情况比仅仅正确获取web.config设置要复杂得多。这就是为什么我限制了问题的范围。我会尝试澄清描述。 - Larsenal

0
在每个HTTP处理程序的开头设置断点,并注意在重定向发生之前最后调用的处理程序。您可能会在其中一个处理程序中找到问题的原因。

0
您可以使用以下方法在自己的代码中查找重定向:
打开“异常设置”窗口并搜索“threadabort”。选中ThreadAbortException的复选框。现在,当从代码执行重定向时,您的调试会话将进入断点模式。

Exception Settings

但是,既然你在谈论 web.config 中的身份验证,很可能问题就出在那里,而不是代码中。

请仔细检查所有的 authorization 元素,如 HectorMac's answer 所述,确保它们都是正确的。


0

你尝试过打开跟踪吗?那可能会有所帮助。

你是如何指定页面不需要身份验证的,比如:

<system.web>
...
</system.web>

<location path="NoAuthNeeded.aspx">
    <system.web>
        <authorization>
        <allow roles="*" />
        <allow roles="?" />
        </authorization>
    </system.web>
</location>

跟踪器并不是非常有用,因为它只显示在重定向被触发后加载的页面。它不会告诉你重定向的编程来源。 - Larsenal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接