在ASP.NET 2.0 WebForms中使用UrlRewrite时如何优雅地处理ReturnUrl

Bri*_*Kim 5 asp.net webforms forms-authentication url-rewriting returnurl

我有一个包含多个.aspx页面的文件夹,我想限制访问.我已将web.config添加到该文件夹​​中<deny users="?"/>.

问题是当我使用UrlRewrite时,ReturnUrl是使用.aspx文件的物理路径自动生成的.

有没有办法在不进行手动身份验证检查和重定向的情况下操作ReturnUrl?有没有办法从代码隐藏或web.config设置ReturnUrl?

编辑:该应用程序使用ASP.NET 2.0 WebForms.我不能使用3.5路由.

编辑2:似乎从未捕获401状态代码.它为受保护的页面返回302,并使用ReturnUrl重定向到登录页面.它不会为受保护的页面返回401.嗯......有趣...参考:http://msdn.microsoft.com/en-us/library/aa480476.aspx

这使事情变得更难......我可能必须写反向重写映射规则到正则表达式匹配ReturnUrl并替换它如果它不返回401 ...如果它确实返回401我可以将RawUrl设置为Response.RedirectLocation或替换ReturnUrl与RawUrl.

其他人还有其他想法吗?

Bri*_*Kim 1

我最终检查了 Url 中是否存在 ReturnUrl,并在 Global.asax 的 EndRequest 阶段将其替换为 RawUrl。这目前对我有用......

这篇博文帮助我进行了设置。

protected void Application_EndRequest(object sender, EventArgs e)
{
    string redirectUrl = this.Response.RedirectLocation;
    if (!this.Request.RawUrl.Contains("ReturnUrl=") && !string.IsNullOrEmpty(redirectUrl))
    {
        this.Response.RedirectLocation = Regex.Replace(redirectUrl, "ReturnUrl=(?'url'[^&]*)", delegate(Match m)
        {
            return string.Format("ReturnUrl={0}", HttpUtility.UrlEncode(this.Request.RawUrl));
        }, RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);
    }
}
Run Code Online (Sandbox Code Playgroud)