Request.UrlReferrer为空?

在一个aspx C#.NET页面(我正在运行框架v3.5),我需要知道用户来自哪里,因为他们无法login查看页面。如果我有页面A (用户希望查看的页面)redirect到页面B (login页面),Request.UrlReferrer对象为空。

背景:如果用户没有login,我redirect到login页面(在这种情况下B )。 login后,我想将它们返回到他们要求login前的页面。

更新:
一个很好的快速解决scheme似乎是:
//if user not logged in Response.Redirect("..MyLoginPage.aspx?returnUrl=" + Request.ServerVariables["SCRIPT_NAME"]);
然后,只需在login页面上查看QueryString,就可以强制它们,并在成功login后将用户放在他们所在的位置。

如果您使用标准的成员资格提供程序,并为目录/页面设置授权,则代码将自动设置一个查询参数ReturnUrl并在成功login后redirect。

如果您不想使用成员资格提供程序模式,我会build议手动执行查询string参数的事情。 HTTP引用者不是很可靠。

UrlReferrer基于浏览器应该发送的HTTP_REFERER头。 但是,就像所有留给客户的东西一样,这是可变的。

我知道一些“安全”套件(如诺顿的互联网安全套装)将剥夺这个头,相信它有助于跟踪用户的行为。 另外,我确定有一些Firefox扩展可以做同样的事情。

底线是你不应该相信它。 只需将url附加到GETstring,然后redirect。

更新:正如在评论中提到的,这可能是一个好主意,限制从GET参数的redirect只适用于无域的相对链接,拒绝目录模式(../)等等。所以仍然理智检查redirect; 如果你遵循标准的“不要盲目使用任何用户提供的input”规则,你应该是安全的。

问题可能与您如何将用户redirect到其他页面有关。 无论如何,引用url是你应该采取的绝对规则 – 客户可以很容易地伪造它。

你正在寻找最好的查询stringvariables(例如,returnURL或originURL)。 引用最好用于数据挖掘操​​作,因为它非常不可靠。

看到ASP.Net的方式与loginredirect的例子。