كيفية التعامل مع erolllly بشكل أنيق عند استخدام Urlrewrite في WebForms ASP.NET 2.0

StackOverflow https://stackoverflow.com/questions/1828098

سؤال

لدي مجلد مع صفحات .aspx متعددة التي أرغب في تقييد الوصول إليها. لقد أضفت web.config إلى هذا المجلد مع <deny users="?"/>.

المشكلة هي أن RetureLL يتم إنشاؤها تلقائيا بالمسار الفعلي إلى ملف .aspx أثناء استخدام urlrewrite.

هل هناك طريقة لمعالجة العائد دون القيام بفحص المصادقة اليدوية وإعادة التوجيه؟ هل هناك طريقة لتعيين العائد من التعليمات البرمجية أو من Web.config؟

تعديل: التطبيق يستخدم WebForms ASP.NET 2.0. لا أستطيع استخدام 3.5 التوجيه.

تحرير 2.: يبدو أنه مثل رمز الحالة 401 لم يتم التقاطه أبدا. ترجع 302 للحصول على الصفحة المحمية وإعادة التوجيه إلى صفحة تسجيل الدخول مع العائد. لا يعود 401 للحصول على الصفحة المحمية. هم ... مثيرة للاهتمام ... المرجع: http://msdn.microsoft.com/en-us/library/a480476.aspx.

هذا يجعل الأمور أكثر صعوبة ... قد تضطر إلى كتابة قواعد إعادة كتابة عكس إعادة الكتابة إلى Regex Match RetchedUrl واستبدلها إذا لم تعد 401 ... إذا كان العودة 401، يمكنني إما تعيين Rawurl إلى Response.redirectlocation أو استبدال العائد مع رياميل.

أي شخص آخر لديه أية أفكار أخرى؟

هل كانت مفيدة؟

المحلول 3

انتهى بي الأمر بالتحقق من وجود عائد العائد في عنوان URL واستبداله مع Rawurl في مرحلة EndRequest في Global.asax. هذا يعمل بالنسبة لي الآن ...

هذه مشاركة مدونة ساعدني في إعداده.

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

نصائح أخرى

تحقق من ذلك. أتمنى أن يساعدك هذا.

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

قم بإنشاء محول التحكم التالي لإعادة كتابة علامة النموذج مع سمة الإجراء. لقد استخدمت هذا التطبيق ASP.NET 2.0 بالتزامن مع ذكاء إعادة توجيه URL. حصلت عليه من هذا وظيفة بلوق من قو.

ضع هذه الفئة في مجلد 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);
    }
}

ثم، قم بإنشاء ملف .Browser في مجلد App_Browsers الخاص بك:

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

إذا كنت تستخدم ASP.NET 3.5، فاستخدم URLRouting ASP.NET بدلا من ذلك. ولكن يجب عليك التحقق من تفادلي التفويض.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top