Question

J'ai un dossier avec plusieurs pages .aspx que je veux restreindre l'accès. J'ai ajouté web.config à ce dossier avec <deny users="?"/>.

Le problème est que ReturnUrl est généré automatiquement avec chemin d'accès physique au fichier .aspx pendant que je suis en utilisant UrlRewrite.

Y at-il un moyen de manipuler ReturnUrl sans faire vérifier d'authentification manuelle et redirection? Y at-il un moyen de définir ReturnUrl de code-behind ou de web.config?

modifier : L'application utilise ASP.NET 2.0 WebForms. Je ne peux pas utiliser le routage 3.5.

EDIT 2 : Il semble que 401 code d'état est jamais capturé. Il retourne 302 pour la page protégée et redirige vers la page de connexion avec ReturnUrl. Il ne retourne pas 401 pour la page protégée. Hmm ... Intéressant ... Réf: http://msdn.microsoft. com / fr-fr / bibliothèque / aa480476.aspx

Cela rend les choses plus difficiles ... je pourrais avoir à écrire de réécrire les règles de mappage inverse à ReturnUrl match regex et le remplacer si elle ne retourne pas 401 ... Si elle ne retourne 401 je peux soit mettre RawUrl à Response.RedirectLocation ou remplacer ReturnUrl avec RawUrl.

Quelqu'un d'autre a d'autres idées?

Était-ce utile?

La solution 3

J'ai fini par vérifier l'existence de ReturnUrl dans l'URL et le remplacer par RawUrl au stade EndRequest dans Global.asax. Cela fonctionne pour moi pour l'instant ...

blog m'a aidé à sa mise en place.

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

Autres conseils

Check it out. Espérons que cela aide.

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

Créer l'adaptateur de commande suivante pour réécrire la balise form avec l'attribut pour l'action. J'ai utilisé cette une application ASP.NET 2.0 en collaboration avec le Intelligencia de la rewriter url. Je l'ai obtenu de cette blog du Gu.

Mettez cette classe dans votre dossier 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);
    }
}

Ensuite, créez ce fichier .browser dans votre dossier App_Browsers:

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

Si vous utilisez ASP.NET 3.5, utilisez ASP.NET UrlRouting à la place. Mais vous devez vérifier la manualy d'autorisation.

http: //chriscavanagh.wordpress. com / 2008/03/11 / aspnet-routage-goodbye-url-rewriting /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top