إعادة توجيه إلى تسجيل الدخول لا يعمل إذا الحالية url يحتوي بالفعل على ReturnUrl

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

سؤال

بعض المعلومات: عميلنا أردت عددا من الإجراءات للعودة إلى العمل السابقة عند القيام به.على سبيل المثال ، إذا كان على طريقة عرض قائمة من الأشياء و هو النقر على "إنشاء كائن جديد" زر, انه يريد العودة الى عرض القائمة بعد أن كان يملأ ويحفظ شكل أو بعد انه يلغي العمل.نفذنا ذلك عن طريق محاكاة ReturnUrl السلوك الذي يتم استخدامه مع محاولات الوصول غير المصرح به (إضافة الحالي عنوان url ترميز استعلام معلمة).

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

النتيجة المتوقعة سوف تكون إعادة توجيه إلى شاشة تسجيل الدخول مع (رابط النسخة المشفرة من) رابط الحالية وضعت في ReturnUrl المعلمة (بغض النظر عن ما إذا كان عنوان url يتضمن الخاصة ReturnUrl المعلمة أو لا)

هل هناك طريقة لجعلها تعمل كما هو متوقع ؟ متأكد من الناحية النظرية لا يمكن إعادة تسمية "ReturnUrl" المعلمة (في أعمالي) إلى شيء آخر ، لكننا تستخدم هذه المعلمة في العديد من الأماكن بالفعل أن تسمية لهم لن يكون مهمة سهلة.كما أنني لا أفهم حقا لماذا لم ينجح هذا في المقام الأول.

P. S.المشكلة فقط تحدث إذا أنا اسم المعلمة ReturnUrl, ، إذا كان returnUrl كل شيء يعمل كما يجب.


تحرير:هذا السؤال كان يسمى سابقا:الوصول غير المصرح به إلى تقييد إجراءات إرجاع أي شيء إذا كان عنوان url يحتوي على معلمة يسمى ReturnUrl.لقد غيرت العنوان لجعلها أسهل للفهم.


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

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

المحلول

ذيس ثبت رئيسيا الألم إلى الإصلاح, ولكن تمكنت من فعل ذلك.في السعي للعثور على سبب إعادة توجيه إلى تسجيل الدخول فشل بعض عناوين أجبت نفسي سؤال مهم.ما هو في الواقع مسؤولة عن القيام توجيه وكيف يمكن تجاوز ذلك ؟

هذا المادة وضعني على الطريق الصحيح (الشيء المسؤول عن توجيه كانت [Authorize] فلتر) و بدأت في البحث عن حل.بعد قليل من البحث وجدت هذا بسيطة مخصصة إذن التصفية.بالطبع لم أفعل ما أريد من خارج منطقة الجزاء (و ما أريده هو الأساس للحصول على الإذن للعمل مثل عادة ولكن ليس لكسر على عناوين url التي تحتوي على ReturnUrl بارام) ، لذلك أنا غيرت رمز و حصلت على هذا:

public class Authorize2 : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        // 1. Get the default login url that was declared in web.config
        string returnUrl = FormsAuthentication.LoginUrl;
        // 2. Append current url as a return url to the login url
        returnUrl += "?ReturnUrl=" + HttpUtility.UrlEncode(HttpContext.Current.Request.Url.PathAndQuery);
        // 3. ...
        // 4. Profit
        filterContext.Result = new RedirectResult(returnUrl);
    }
}

بعد كتابة هذا قطعة من التعليمات البرمجية, قضيت ساعة أخرى في محاولة لمعرفة لماذا لا تعمل (نقاط داخل HandleUnauthorizedRequest لم تصل).ثم وجدت هذا و فجأة المنطقي.زميل لي إضافة العالمية Authorize تصفية على جميع الإجراءات لأي سبب من الأسباب و بلدي تصفية مخصص لم يكن طلب أن تأذن أي شيء (\App_Start\FilterConfig.cs).بعد إزالة هذا الخط (أنا يجب أن أضع تصفية مخصص في مكانها في نهاية المطاف) ، رمز أعلاه تعمل مثل السحر.

في طريقة السؤال لا يزال مفتوحا ، أعني أن الأمر لا يزال لغزا لم يأذن فشل تلك العناوين.الجواب على هذا السؤال بلا شك يكمن في System.Web.Mvc.AuthorizeAttribute شفرة المصدر, ولكن الآن أنا راض تماما وبعد ذلك العمل بشكل صحيح.

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