5

Ich habe einen Ordner mit mehreren ASPX-Seiten, auf die ich den Zugriff beschränken möchte. Ich habe web.config zu diesem Ordner mit <deny users="?"/> hinzugefügt.Wie behandelt man elegant ReturnUrl bei der Verwendung von UrlRewrite in ASP.NET 2.0 WebForms

Das Problem ist, dass ReturnUrl automatisch mit dem physischen Pfad zur ASPX-Datei generiert wird, während ich UrlRewrite verwende.

Gibt es eine Möglichkeit, ReturnUrl zu manipulieren, ohne manuelle Authentifizierung und Umleitung durchzuführen? Gibt es eine Möglichkeit, ReturnUrl aus Code-Behind oder aus web.config festzulegen?

BEARBEITEN: Die Anwendung verwendet ASP.NET 2.0 WebForms. Ich kann das 3.5-Routing nicht verwenden.

EDIT 2: Es scheint wie 401 Statuscode nie erfasst wird. Es gibt 302 für geschützte Seite zurück und leitet mit ReturnUrl zur Anmeldeseite um. 401 für geschützte Seite wird nicht zurückgegeben. Hmm ... Interessant ... Ref: http://msdn.microsoft.com/en-us/library/aa480476.aspx

Das macht die Dinge schwieriger ... Ich muss Reverse Rewrite Mapping-Regeln zu regex Match ReturnUrl schreiben und ersetzen, wenn es nicht 401 zurückgibt ... Wenn es gibt 401 zurück Ich kann RawUrl entweder auf Response.RedirectLocation setzen oder ReturnUrl durch RawUrl ersetzen.

Hat noch jemand andere Ideen?

+0

Wer sonst noch mit anderen Vorschlägen? –

Antwort

1

ich die Existenz von ReturnUrl in der URL Überprüfung beendet und Ersetzen Sie es in der EndRequest-Phase in Global.asax durch RawUrl. Dies funktioniert für mich jetzt ...

Diese blog post half mir bei der Einrichtung.

1

Check it out. Hoffe das hilft.

#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

Danke. Ich werde es versuchen. –

+0

Es gibt keine Möglichkeit dazwischen abzufangen, um ReturnUrl durch RawUrl zu ersetzen. –

+0

Statuscode 401 wird nie erfasst ... Es geht geschützte Seite (302) -> Login mit ReturnUrl (200). –

1

Erstellen Sie den folgenden Steuerungsadapter den Formular-Tag mit dem für das action-Attribut neu zu schreiben. Ich benutzte dies eine ASP.NET 2.0 App in Verbindung mit der Intelligencia URL Rewriter. Ich habe es von diesem blog post from the Gu bekommen.

Setzen Sie diese Klasse in Ihrem Ordner 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); 
    } 
} 

Dann erstellen Sie diese .Browser Datei in Ihrem App_Browsers Ordner:

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

Scheint wie dieser kümmert sich um URL der Seite auf Postback.Was ich suche, ist die saubere URL-Rewrite für automatisch generierte ReturnUrl-Querystrings, wenn Sie eine nicht authentifizierte eingeschränkte Seite treffen. –

+0

Ich glaube, dass es das auch tun sollte, aber ich bin mir nicht sicher. – craigmoliver