Pregunta

Tengo una carpeta con varias páginas .aspx que desea restringir el acceso a. He añadido web.config para esa carpeta con <deny users="?"/>.

El problema es que es ReturnUrl genera automáticamente con la ruta física del archivo .aspx mientras estoy usando UrlRewrite.

¿Hay una manera de manipular ReturnUrl sin hacer comprobación de autenticación manual y redirección? ¿Hay una manera de establecer ReturnUrl de código subyacente o desde web.config?

editar : La aplicación utiliza ASP.NET 2.0 WebForms. No puedo usar el enrutamiento 3.5.

EDIT 2 : Parece que el código de estado 401 no es capturado. Devuelve 302 por página protegida y redirige a la página de acceso con ReturnUrl. No devuelve 401 para la página protegida. Hmm ... Interesante ... Ref: http://msdn.microsoft. com / es-es / library / aa480476.aspx

Esto hace las cosas más difíciles ... voy a tener que escribir inversa reescribir las reglas de asignación para que coincida con la expresión regular ReturnUrl y reemplazarlo si no devuelve 401 ... Si no lo hace regresar 401 o bien puedo configurar RawUrl a Response.RedirectLocation o reemplazar ReturnUrl con RawUrl.

Alguien más tiene alguna otra idea?

¿Fue útil?

Solución 3

Terminé la comprobación de la existencia de ReturnUrl en la dirección URL y su sustitución por RawUrl en la etapa EndRequest en Global.asax. Esto funciona para mí por ahora ...

Este entrada de blog me ayudó a su puesta en marcha.

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

Otros consejos

Compruébelo usted mismo. Espero que esto ayude.

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

Cree el siguiente adaptador de control para volver a escribir la etiqueta de formulario con el para el atributo de acción. He utilizado este 2,0 aplicación un ASP.NET en conjunción con el Intelligencia rewriter url. Lo obtuve de esta entrada en el blog de la Gu .

Ponga esta clase en su carpeta 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);
    }
}

A continuación, crear este archivo en la carpeta de .browser App_Browsers:

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

Si está utilizando ASP.NET 3.5, utilizar ASP.NET UrlRouting lugar. Pero usted debe comprobar la manualy autorización.

http: //chriscavanagh.wordpress. com / 2008/03/11 / Red PEA-enrutamiento-adiós-url-reescritura /

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top