Frage

Ich habe einen Ordner mit mehreren ASPX-Seiten, die ich Zugang beschränken möchten. Ich habe web.config in diesem Ordner mit <deny users="?"/> hinzugefügt.

Das Problem ist, dass ReturnUrl ist automatisch generierte mit physischem Pfad der ASPX-Datei, während ich UrlRewrite bin mit.

Gibt es eine Möglichkeit ReturnUrl ohne machen die manuelle Authentizitätsprüfung und Umleitung zu manipulieren? Gibt es eine Möglichkeit ReturnUrl von Code-Behind oder von web.config zu setzen?

Bearbeiten : Die Anwendung ist mit ASP.NET 2.0 WebForms. Ich kann nicht mehr als 3,5 Routing verwenden.

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

Das macht die Sache schwieriger ... Ich könnte Mapping-Regeln zu Regex ReturnUrl und ersetzen Sie es schreiben Reverse umschreiben, wenn es nicht 401 zurückkehrt ... Wenn ich es nicht 401 Rückkehr entweder RawUrl auf Response.RedirectLocation einstellen oder ersetzen ReturnUrl mit RawUrl.

Noch jemand noch andere Ideen?

War es hilfreich?

Lösung 3

beenden ich die Existenz von ReturnUrl in den URL Überprüfung und es mit RawUrl in Endrequest Bühne in Global.asax zu ersetzen. Dies funktioniert für mich jetzt ...

Das Blog-Post hat mir geholfen, es einrichten.

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

Andere Tipps

Überprüfen Sie es heraus. 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>

Erstellen Sie den folgenden Steuerungsadapter den Formular-Tag mit dem für das action-Attribut neu zu schreiben. Ich habe diese ein ASP.NET 2.0-Anwendung in Verbindung mit den Intelligencia url rewriter. Ich habe es von diesem Blog-Post von der Gu .

Setzen Sie diese Klasse im 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>

Wenn Sie ASP.NET verwenden 3.5, verwenden Sie stattdessen ASP.NET UrlRouting. Aber Sie müssen die Berechtigung manualy überprüfen.

http: //chriscavanagh.wordpress. com / 2008/03/11 / aspnet-Routing-goodbye-uRL-Rewriting /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top