إعادة كتابة عنوان URL لـ .net للترجمة، ومشكلات تتعلق بمصادقة النماذج وعنوان URL لتسجيل الدخول

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

سؤال

أنا أستخدم HttpModule لإعادة كتابة عناوين URL على موقع متعدد اللغات.في HttpModule، أقوم بإضافة معالج لحدث BeginRequest، وأبحث عن الجزء الأول من المسار الذي يحتوي على اسم الثقافة.

على سبيل المثال، ستتم إعادة كتابة /fr-ca/index.aspx إلى /index.aspx وتعيين ثقافة مؤشر الترابط وثقافة واجهة المستخدم إلى 3084.هذا يعمل بشكل جيد.

أدخل مصادقة النماذج.لا تزال مصادقة النماذج تعمل بشكل جيد مع عنوان URL غير المعين، ولكن إذا كان المستخدم غير مصرح به، فستتم إعادة التوجيه إلى عنوان URL لتسجيل الدخول كما هو محدد في قسم المصادقة في web.config، وتتضمن المعلمة ?ReturnUrl= querystring للتعامل مع إعادة التوجيه مرة أخرى إلى العنوان المطلوب الصفحة بمجرد مصادقة المستخدم.

هناك مشكلتان هنا إذا طلب المستخدم صفحة بلغة غير اللغة الافتراضية:

  1. يتجاهل تسجيل الدخول Url المسار قبل إعادة كتابته
  2. تجاهلت المعلمة ReturnUrl أيضًا المسار الأولي.

إنه يعادل Request.Url.PathAndQuery بدلاً من Request.RawUrl.

لا يمكنني الانتقال إلى المسار في حدث AuthorizeRequest بدلاً من ذلك لأنه سيتعين علي حينها الحماية من جميع قيم الثقافة المحتملة، لأنني أستخدم ملف web.config واحدًا مع مسارات مواقع متعددة.وهذا أيضًا لا يحل المشكلة الأولى.

لقد قمت بالاطلاع على FormsAuthenticationModule في العاكس وأرى أين يمكنني تغييره لحل رقم 1 ورقم 2، ولكنه بالطبع مغلق.

لقد قمت أيضًا بالتصفح كثيرًا، لكن لا يمكنني رؤية أي حلول عملية.

يقوم FormsAuthenticationModule بالتحقق من رأس 401 الذي تم إنشاؤه في UrlAuthorizationModule.إذا بحثت عن المُحيل (وهو فارغ) في صفحة تسجيل الدخول Url، فهذا يؤكد ذلك.

أي أفكار؟

تحرير رقم 1

أنا أستخدم IIS 6، وIIS 7 ليس خيارًا.

تحرير رقم 2

لم تكن صفحة تسجيل الدخول تلتقط الثقافة الافتراضية/ثقافة واجهة المستخدم لأنه عندما قمت بإنشاء المورد المحلي (عرض التصميم:أدوات > إنشاء مورد محلي)، أضاف IDE ما يلي إلى توجيه الصفحة:

الثقافة = "تلقائي" meta:resourcekey = "PageResource1" uiculture = "تلقائي"

كن حذرًا مع هذا في vs.net 2008!يؤدي هذا على الأقل إلى حل إحدى المشكلات المتعلقة بعدم الرجوع إلى الثقافة الافتراضية، ولكن رقم 1 ورقم 2 لا يزالان معلقين.

تحرير 3

كنت آمل أن أتمكن من الانتقال إلى أحد أحداث المسار لإجراء عملية إعادة التوجيه الخاصة بي، ولكن في انعكاس طريقة System.Web.Security.UrlAuthorizationModule OnEnter، تعلمت أنه بمجرد تعيين رأس 401، تستدعي الطريقة application.CompleteRequest، والتي كما يمكنك أن تتخيل، يقودنا هذا مباشرة إلى حدث EndRequest.هذا هو ما تقفز إليه وحدة FA للقيام بإعادة التوجيه، وأخشى أنني لا أستطيع القفز للأمام للقيام بإعادة التوجيه بنفسي!أنا مندهش من عدم وجود المزيد من الأشخاص الذين يصادفون هذه المشكلة، أو ربما لم يتفاعلوا معها بعد.


مثال:

لدي قسم خاص بالأعضاء في المجلد الفعلي /أعضاء/ المحمي بواسطة مصادقة النماذج.

في web.config، لدي:

<authentication mode="Forms">
  <forms loginUrl="~/members/login.aspx" timeout="40" />
</authentication>

و...

  <location path="members">
      <system.web>
          <authorization>
              <deny users="?" />
              <allow roles="Members" />
              <deny users="*" />
          </authorization>
      </system.web>
  </location>

عندما يطلب مستخدم غير مصادق صفحة فهرس /أعضاء/، تتم إعادة توجيهه إلى عنوان URL لتسجيل الدخول من قسم المصادقة أعلاه بواسطة FormsAuthenticationModule.كما يقوم أيضًا بإلحاق المعلمة "ReturnUrl" بالصفحة المطلوبة.

يعمل هذا بشكل جيد إذا كان المستخدم يتصفح موقع الويب باستخدام الثقافة الافتراضية، ولكن HttpModule الخاص بي يقوم بتعيين الثقافة بناءً على وجود اسم الثقافة في الجزء الأول من المسار.

لذلك، تتم إعادة كتابة /fr-ca/members/index.aspx إلى /members/index.aspx وتعيين ثقافة واجهة المستخدم/الثقافة إلى الفرنسية الكندية.لسوء الحظ، يرسل FormsAuthenticationModule المستخدم إلى صفحة تسجيل الدخولUrl مع عنوان URL المعاد كتابته، وليس الأصلي.لذلك، يتم فقدان إعداد الثقافة ويكون عنوان URL لإعادة التوجيه غير صحيح.

نأمل أن يساعد @ جريج

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

المحلول

حسنًا، تم حل المشكلة.

اتضح أن المفتاح كان يقوم بمسح httpModules في Machine.config، وإضافة httpModule المخصص الخاص بي، ثم إضافة httpModules الافتراضية المطلوبة مرة أخرى.سمح هذا لـ httpModule المخصص الخاص بي بالانتقال إلى حدث EndRequest قبل FormsAuthenticationHttpModule.

<httpModules>
    <clear/>
    <!-- custom -->
    <add name="LocalizationHttpModule" type="LocalizationHttpModule"/>
    <!-- add back defaults, exlude PassportAuthentication, AnonymousIdentification, Profile -->
    <add name="OutputCache" type="System.Web.Caching.OutputCacheModule" />
    <add name="Session" type="System.Web.SessionState.SessionStateModule" />
    <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" />
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />
    <add name="RoleManager" type="System.Web.Security.RoleManagerModule" />
    <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
    <add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" />

</httpModules> 

بعد ذلك، في httpModule المخصص الخاص بي، ما عليك سوى النقر على EndRequest، والبحث عن رمز الحالة 401، وإعادة التوجيه كما أريد.أقوم بشكل أساسي بإعادة كتابة التعليمات البرمجية من طريقة FormsAuthenticationHttpModule OnLeave لتناسب احتياجاتي.

Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init

    Dim authentication As AuthenticationSection = WebConfigurationManager.GetSection("system.web/authentication")
    If authentication.Mode = AuthenticationMode.Forms Then
        Me._LoginUrl = authentication.Forms.LoginUrl
        AddHandler context.EndRequest, AddressOf Context_EndRequest
    End If

End Sub

Private Sub Context_EndRequest(ByVal sender As Object, ByVal e As EventArgs)
    Dim application As HttpApplication = DirectCast(sender, HttpApplication)
    Dim context As HttpContext = application.Context

    If (context.Response.StatusCode = &H191) Then                
       ' do custom redirect here
    End If

End Sub

نصائح أخرى

الشيء الوحيد الذي يمكنني التفكير فيه هو إعادة التوجيه إلى نموذج تسجيل الدخول يدويًا.

1) السماح للجميع بالوصول إلى دليل العضوية
2) ترث جميع الصفحات الموجودة في العضوية مباشرة من فئة فرعية من الصفحة.
3) في PreInit(?) للفئة الفرعية للصفحة، تحقق لمعرفة ما إذا كان المستخدم عضوًا في دور العضوية.
4) إذا لم يكن الأمر كذلك، فقم بإنشاء عنوان URL لصفحة تسجيل الدخول بنفسك، بما في ذلك معلمة ReturnURL وأعد توجيه المستخدم إلى عنوان URL لتسجيل الدخول الخاص بك.

قد تتمكن أيضًا من اختراق ذلك عن طريق وضع مجموعة من أقسام < location> في ملف web.config الخاص بك.السابق:< مسار الموقع = "fr-ca/members">< المصادقة>< نماذج تسجيل الدخولUrl="~/fr-ca/members/login.aspx">...ولكن ليس لدي أي فكرة حقًا.

ربما هناك طرق أخرى للقيام بذلك لست على دراية بها.

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