Domanda

Ho una cartella con più pagine aspx che voglio limitare l'accesso a. Ho aggiunto web.config a quella cartella con <deny users="?"/>.

Il problema è che ReturnUrl è generato automaticamente con il percorso fisico al file aspx, mentre io sto usando URLRewrite.

C'è un modo per manipolare ReturnUrl senza fare controllo di autenticazione manuale e reindirizzamento? C'è un modo per impostare ReturnUrl dal code-behind o da web.config?

Modifica : L'applicazione utilizza ASP.NET 2.0 WebForms. Non posso usare 3.5 di routing.

Modifica 2 : Sembra che 401 codice di stato non viene mai catturato. Esso restituisce 302 per la pagina protetta e reindirizza alla pagina di login con ReturnUrl. Non restituisce 401 per la pagina protetta. Hmm ... Interessante ... Rif: http://msdn.microsoft. com / it-it / library / aa480476.aspx

Questo rende le cose più difficili ... avrei potuto scrivere inverso riscrivere le regole di mappatura per regex partita ReturnUrl e sostituirlo se non restituisce 401 ... Se non ritorno 401 posso entrambi i set RawUrl a Response.RedirectLocation o sostituire ReturnUrl con RawUrl.

Qualcun altro ha altre idee?

È stato utile?

Soluzione 3

Ho finito per il controllo per l'esistenza di ReturnUrl nella URL e la sua sostituzione con RawUrl in EndRequest fase in Global.asax. Questo funziona per me, per ora ...

Questo post sul blog ha aiutato l'impostazione me up.

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

Altri suggerimenti

Check it out. Spero che questo aiuti.

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

Creare la seguente adattatore di controllo di riscrivere il tag di modulo con la per l'attributo action. Ho usato questo 2.0 applicazione di un ASP.NET in concomitanza con la Intelligencia masterizzatore URL. L'ho avuta da questo post sul blog dal Gu .

Metti questa classe nella cartella 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);
    }
}

Quindi, creare questo file nella cartella .Browser App_Browsers:

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

Se si utilizza ASP.NET 3.5, utilizzare ASP.NET UrlRouting. Ma è necessario verificare il manualy autorizzazione.

http: //chriscavanagh.wordpress. com / 2008/03/11 / aspnet-routing-addio-url-rewriting /

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top