السياق.المستخدم فقدان الأدوار بعد تكليفه العالمية.asax.Application_AuthenticateRequest

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

سؤال

أنا باستخدام مصادقة النماذج في بلدي asp.net (3.5) التطبيق.أنا أيضا باستخدام الأدوار لتحديد ما يمكن المستخدم من الوصول إلى الدلائل التي من التطبيق.وهكذا ، فإن ذات الصلة أقسام الويب الخاص بي.config تبدو مثل هذا:

<system.web>
  <authentication mode="Forms">
    <forms loginUrl="Default.aspx" path="/" protection="All" timeout="360" name="MyAppName" cookieless="UseCookies"  />      
  </authentication>
  <authorization >
    <allow users="*"/>
  </authorization>
</system.web>

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

بناء على ما قرأت ، وهذا ينبغي التأكد من أن المستخدمين فقط قادرة على الوصول إلى دليل المشرف سوف يكون المستخدمين الذين تم المصادقة و تعيين مشرف الدور.

مصادقة المستخدم ، وتوفير تذكرة مصادقة ، وغيرها من القضايا ذات الصلة جميع تعمل بشكل جيد.إذا كنت إزالة العلامات من على شبكة الإنترنت.config, كل شيء يعمل بشكل جيد.المشكلة تأتي عندما كنت في محاولة لفرض هذا فقط للمستخدمين مع دور المشرف يجب أن تكون قادرة على الوصول إلى دليل المسؤول.

بناء على هذا MS مقالة جنبا إلى جنب مع غيرها من صفحات الويب إعطاء نفس المعلومات ، يجب إضافة التعليمات البرمجية التالية إلى العالمية.asax:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
    if (HttpContext.Current.User != null) {
        if (Request.IsAuthenticated == true) {    
            // Debug#1            
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies[FormsAuthentication.FormsCookieName].Value);
            // In this case, ticket.UserData = "Admin"                
            string[] roles = new string[1] { ticket.UserData }; 
            FormsIdentity id = new FormsIdentity(ticket);
            Context.User = new System.Security.Principal.GenericPrincipal(id, roles);
            // Debug#2
        }
    }
}

ومع ذلك ، عندما أحاول تسجيل الدخول, أنا غير قادر على الوصول إلى المجلد Admin (الحصول على إعادة توجيهك إلى صفحة تسجيل الدخول).

محاولة تصحيح المسألة إذا كنت خطوة من خلال طلب ، إذا كنت تنفيذ السياق.المستخدم.IsInRole("المشرف") في خط علامة التصحيح#1 أعلاه بإرجاع false.إذا كنت تنفيذ نفس البيان في خط التصحيح#2, تساوي true.حتى على الأقل بقدر العالمية.asax المعنية ، دور يتم تعيين بشكل صحيح.

بعد العالمية.asax التنفيذ يقفز مباشرة إلى صفحة تسجيل الدخول (نظرا لعدم وجود دور يتسبب في تحميل الصفحة في المجلد admin رفض).ومع ذلك ، عندما بتنفيذ نفس البيان على السطر الأول من Page_Load من الدخول ، بإرجاع false.حتى في مكان ما بعد Application_AuthenticateRequest العالمية.asax و الحمل الأولي من يبفورم في تقييد الدليل ، دور المعلومات المفقودة ، مما تسبب في المصادقة فشل (ملاحظة:في Page_Load السليم تذكرة مصادقة لا تزال تسند إلى السياق.المستخدم.Id - فقط دور هو الضياع).

ما الذي أفعله خطأ ، و كيف يمكنني الحصول عليه للعمل بشكل صحيح ؟


تحديث:دخلت الحل أدناه

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

المحلول

هنا كانت المشكلة والحل:

في وقت سابق في تطوير كنت قد ذهبت إلى موقع القائمة والنقر على Asp.net التكوين.هذا أدى إلى السطر التالي إضافتها إلى شبكة الإنترنت.التكوين:

<system.web>
  <roleManager enabled="true" />
</system.web>

من تلك النقطة, كان التطبيق على افتراض أن كنت أقوم بأدوار خلال Asp.net مدير الموقع و ليس من خلال FormsAuthentication الأدوار.وبالتالي فإن الفشل المتكرر ، على الرغم من أن المصادقة الفعلية والأدوار المنطق تم إعداد بشكل صحيح.

بعد هذا الخط تم إزالتها من على شبكة الإنترنت.التكوين عملت كل شيء تماما.

نصائح أخرى

هذا هو مجرد تسديدة عشوائية ، ولكن يمكنك الحصول على المحظورة بسبب طلب الإذن الادارية ؟ ربما عليك أن تحاول تحويل الخاص بك ينكر كل شيء و كل مشرف.

فقط في حالة الحصول على تجاوزها من قبل ينكر.

(كنت قد نماذج التعليمات البرمجية هنا ولكن لم تظهر.

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