5

Ho una cartella con più pagine .aspx a cui voglio limitare l'accesso. Ho aggiunto web.config a quella cartella con <deny users="?"/>.Come gestire elegante ReturnUrl quando si utilizza UrlRewrite nei WebForms ASP.NET 2.0

Il problema è che ReturnUrl viene generato automaticamente con il percorso fisico del file .aspx mentre sto utilizzando UrlRewrite.

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

MODIFICA: L'applicazione utilizza WebForms ASP.NET 2.0. Non posso usare il routing 3.5.

MODIFICA 2: Sembra che il codice di stato 401 non venga mai catturato. Restituisce 302 per pagina protetta e reindirizza alla pagina di login con ReturnUrl. Non restituisce 401 per pagina protetta. Hmm ... Interessante ... Rif: http://msdn.microsoft.com/en-us/library/aa480476.aspx

Questo rende le cose più difficili ... Potrei dover scrivere regole di mappatura di riscrittura inversa per regex corrispondere a ReturnUrl e sostituirlo se non restituisce 401 ... Se restituisce 401 È possibile impostare RawUrl su Response.RedirectLocation o sostituire ReturnUrl con RawUrl.

Qualcun altro ha altre idee?

+0

Qualcun altro con altri suggerimenti? –

risposta

1

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

Questo blog post mi ha aiutato a configurarlo.

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

Check it out. Spero che questo ti 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> 
+0

Grazie. Darò a questo una prova. –

+0

Non c'è possibilità di intercettare in mezzo per sostituire ReturnUrl con RawUrl. –

+0

Il codice di stato 401 non viene mai catturato ... Va protetto pagina (302) -> login con ReturnUrl (200). –

1

Creare la seguente adattatore di controllo di riscrivere il tag di modulo con la per l'attributo action. Ho usato questa applicazione ASP.NET 2.0 in combinazione con il reindirizzatore di URL Intelligencia. L'ho preso da questo blog post from the Gu.

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

Sembra che questo si occupi dell'URL della pagina sul postback.Quello che sto cercando è l'Url di riscrittura pulito per la querystring ReturnUrl generata automaticamente quando si colpisce una pagina con restrizioni non autenticata. –

+0

Credo che dovrebbe farlo anche io, ma non ne sono sicuro. – craigmoliver