Как элегантно обрабатывать returnUrl при использовании URLRewrite в ASP.NET Веб-формы 2.0
-
11-09-2019 - |
Вопрос
У меня есть папка с несколькими страницами .aspx, к которым я хочу ограничить доступ.Я добавил web.config в эту папку с <deny users="?"/>
.
Проблема в том, что returnUrl автоматически генерируется с физическим путем к файлу .aspx, когда я использую URLRewrite.
Есть ли способ манипулировать returnUrl без ручной проверки подлинности и перенаправления?Есть ли способ установить returnUrl из code-behind или из web.config?
Редактировать:Приложение использует ASP.NET Веб-формы 2.0.Я не могу использовать маршрутизацию 3.5.
ПРАВКА 2:Похоже, что код состояния 401 никогда не фиксируется.Он возвращает 302 для защищенной страницы и перенаправляет на страницу входа с помощью returnUrl.Он не возвращает 401 для защищенной страницы.Хм...Интересно...Ссылка: http://msdn.microsoft.com/en-us/library/aa480476.aspx
Это все усложняет...Возможно, мне придется написать правила сопоставления обратной перезаписи для regex match returnUrl и заменить его, если оно не возвращает 401...Если он возвращает 401, я могу либо установить RawUrl в Response.Перенаправление или заменить returnUrl на RawUrl.
У кого-нибудь еще есть какие-нибудь другие идеи?
Решение 3
В итоге я проверил наличие returnUrl в URL-адресе и заменил его на RawUrl на этапе EndRequest в Global.asax.На данный момент у меня это работает...
Это запись в блоге помог мне его настроить.
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);
}
}
Другие советы
Зацени это.Надеюсь, это поможет.
#region [ Imports ]
using System;
using System.Web;
using System.Web.Security;
#endregion
namespace Foo.Handlers
{
public class AuthModule : IHttpModule
{
#region IHttpModule Members
public void Init(HttpApplication application)
{
application.PostReleaseRequestState += delegate(object s, EventArgs e)
{
if (application.Response.StatusCode == 401)
application.Response.Redirect(FormsAuthentication.LoginUrl + "?ReturnUrl=" + HttpUtility.UrlEncode(application.Request.RawUrl), true);
};
}
public void Dispose() { }
#endregion
}
}
<modules>
<add name="AuthModule" type="Foo.Handlers.AuthModule, Foo"/>
</modules>
Создайте следующий адаптер элемента управления, чтобы переписать тег формы с атрибутом for the action.Я использовал это приложение a ASP.NET 2.0 в сочетании с Intelligencia переписчик URL-адресов.Я получил это от этого запись в блоге от Гу.
Поместите этот класс в вашу папку App_Code:
using System.IO;
using System.Web;
using System.Web.UI;
public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
{
protected override void Render(HtmlTextWriter writer)
{
base.Render(new RewriteFormHtmlTextWriter(writer));
}
}
public class RewriteFormHtmlTextWriter : HtmlTextWriter
{
public RewriteFormHtmlTextWriter(TextWriter writer) : base(writer)
{
base.InnerWriter = writer;
}
public RewriteFormHtmlTextWriter(HtmlTextWriter writer) : base(writer)
{
this.InnerWriter = writer.InnerWriter;
}
public override void WriteAttribute(string name, string value, bool fEncode)
{
// If the attribute we are writing is the "action" attribute, and we are not on a sub-control,
// then replace the value to write with the raw URL of the request - which ensures that we'll
// preserve the PathInfo value on postback scenarios
if ((name == "action"))
{
if (HttpContext.Current.Items["ActionAlreadyWritten"] == null)
{
// Because we are using the UrlRewriting.net HttpModule, we will use the
// Request.RawUrl property within ASP.NET to retrieve the origional URL
// before it was re-written. You'll want to change the line of code below
// if you use a different URL rewriting implementation.
value = HttpContext.Current.Request.RawUrl;
// Indicate that we've already rewritten the <form>'s action attribute to prevent
// us from rewriting a sub-control under the <form> control
HttpContext.Current.Items["ActionAlreadyWritten"] = true;
}
}
base.WriteAttribute(name, value, fEncode);
}
}
Затем создайте этот файл .browser в вашей папке App_Browsers:
<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.HtmlControls.HtmlForm" adapterType="FormRewriterControlAdapter" />
</controlAdapters>
</browser>
</browsers>
Если вы используете ASP.NET 3.5, используйте вместо этого маршрутизацию URL-адресов ASP.NET.Но вы должны проверить авторизацию вручную.
http://chriscavanagh.wordpress.com/2008/03/11/aspnet-routing-goodbye-url-rewriting/