5

Mam folder z wieloma stronami .aspx, które chcę ograniczyć dostęp. Dodałem plik web.config do tego folderu z <deny users="?"/>.Jak elegancko obsługiwać ReturnUrl przy użyciu UrlRewrite w ASP.NET 2.0 WebForms

Problem polega na tym, że funkcja ReturnUrl jest generowana automatycznie ze ścieżką fizyczną do pliku .aspx podczas korzystania z UrlRewrite.

Czy istnieje sposób na manipulowanie funkcją ReturnUrl bez ręcznego sprawdzania autentyczności i przekierowania? Czy istnieje sposób, aby ustawić ReturnUrl z kodu z tyłu lub z web.config?

EDIT: Aplikacja korzysta z WebForms ASP.NET 2.0. Nie mogę używać routingu 3.5.

EDIT 2: Wygląda na to, że kod statusu 401 nigdy nie jest przechwytywany. Zwraca 302 dla chronionej strony i przekierowuje do strony logowania za pomocą ReturnUrl. Nie zwraca 401 dla chronionej strony. Hmm ... Interesujące ... Ref: http://msdn.microsoft.com/en-us/library/aa480476.aspx

To sprawia, że ​​rzeczy trudniejsze ... Być może będę musiał napisać zasady odwrotnego przepisywania odwzorowań, aby wyreperować dopasowanie ReturnUrl i zastąpić je, jeśli nie zwróci 401 ... Jeśli to zwraca 401 Mogę ustawić RawUrl na Response.RedirectLocation lub zamienić ReturnUrl na RawUrl.

Ktoś jeszcze ma jakieś pomysły?

+0

Ktoś jeszcze z innymi sugestiami? –

Odpowiedz

1

skończyło się sprawdzanie istnienia ReturnURL w URL-i zastąpienie go RawUrl w etapie EndRequest w Global.asax. To działa na mnie teraz ...

Ten blog post pomógł mi go skonfigurować.

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); 
    } 
} 
1

Sprawdź to. Mam nadzieję że to pomoże.

#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> 
+0

Dzięki. Dam to spróbować. –

+0

Nie ma szansy na przechwycenie pomiędzy, aby zastąpić ReturnUrl z RawUrl. –

+0

Kod statusu 401 nigdy nie jest przechwytywany ... Przechodzi chronioną stronę (302) -> Zaloguj się za pomocą ReturnUrl (200). –

1

Utwórz następujący adapter sterowania przepisać tag formularz z atrybutu działania. Używałem tej aplikacji ASP.NET 2.0 w połączeniu z pisarzem do odświeżania adresu URL Intelligencia. Mam to z tego blog post from the Gu.

Put tej klasy w folderze 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); 
    } 
} 

Następnie należy utworzyć ten plik .browser w folderze App_Browsers:

<browsers> 
    <browser refID="Default"> 
    <controlAdapters> 
     <adapter controlType="System.Web.UI.HtmlControls.HtmlForm" adapterType="FormRewriterControlAdapter" /> 
    </controlAdapters> 
    </browser> 
</browsers> 
+0

Wygląda na to, że ten dba o URL strony na poczcie zwrotnej.Czego szukam to czysty URL do przepisywania dla automatycznie generowanego zapytania wstecznego, gdy trafisz na nieuwierzytelnioną stronę z ograniczeniami. –

+0

Uważam, że powinno to również nastąpić, ale nie jestem pewien. – craigmoliver

Powiązane problemy