تجاوز مصادقة النماذج التلقائي إعادة توجيه إلى تسجيل الدخول, كيف ؟

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

سؤال

أنا أكتب التطبيق باستخدام asp.صافي-mvc نشر iis6.أنا باستخدام مصادقة النماذج.عادة عندما يحاول مستخدم الوصول إلى مورد دون ترخيص أريد لها أن تكون توجيهك إلى صفحة تسجيل الدخول.FormsAuth يفعل ذلك بالنسبة لي من السهل بما فيه الكفاية.

المشكلة:الآن لدي عمل يتم الوصول إليها عن طريق وحدة التحكم التطبيق.ما أسرع طريقة أن يكون هذا العمل الاستجابة ث/ حالة 401 بدلا من إعادة توجيه الطلب إلى صفحة تسجيل الدخول?

أريد وحدة التحكم التطبيق لتكون قادرة على الرد على هذا 401 StatusCode بدلا من كونها شفافة.أود أيضا للحفاظ على الافتراضي, إعادة توجيه طلبات غير المصرح به إلى صفحة تسجيل الدخول السلوك.

ملاحظة:بمثابة اختبار أضيف هذا إلى العالمية.asax و لم تجاوز أشكال المصادقة:

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
    HttpContext.Current.SkipAuthorization = true;
}

@دايل و اندي

أنا باستخدام AuthorizeAttributeFilter المقدمة في MVC معاينة 4.هذا هو إعادة HttpUnauthorizedResult.هذه النتيجة بشكل صحيح وضع statusCode إلى 401.المشكلة كما فهمت هو أن asp.net هو اعتراض الرد (منذ taged كما 401) و إعادة توجيه إلى صفحة تسجيل الدخول بدلا من مجرد السماح لها الذهاب من خلال.أريد أن تجاوز هذا الاعتراض على بعض عناوين url.

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

المحلول

حسنا, لقد عملت حول هذا.أنا جعلت مخصص ActionResult (HttpForbiddenResult) والعرف ActionFilter (NoFallBackAuthorize).

لتجنب توجيه HttpForbiddenResult علامات الردود مع رمز الحالة 403.FormsAuthentication لا يصاب الردود مع هذا الرمز حتى تسجيل الدخول إعادة توجيه فعال تخطي.على NoFallBackAuthorize تصفية التحقق لمعرفة ما إذا كان المستخدم مخولا مثل الكثير من تضمين يأذن التصفية.فإنه يختلف في أنه يعود HttpForbiddenResult عندما تم رفض الوصول.

على HttpForbiddenResult هو تافهة جدا:

public class HttpForbiddenResult : ActionResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        context.HttpContext.Response.StatusCode = 0x193; // 403
    }
}

فإنه لا يبدو أن يكون من الممكن تخطي صفحة الدخول إعادة توجيه في FormsAuthenticationModule.

نصائح أخرى

قد يكون الهمجية (و قد لا تعمل حتى) ولكن على صفحة تسجيل الدخول الخاصة بك وانظر إذا Request.QueryString["ReturnUrl"] != null وإذا كان الأمر كذلك مجموعة Response.StatusCode = 401.

نضع في اعتبارنا أن كنت سوف لا تزال بحاجة إلى الحصول على وحدة التحكم الخاصة بك التطبيق لمصادقة بطريقة أو بأخرى.كنت لا تحصل على HTTP الأساسية المصادقة مجانا:عليك أن لفة الخاص بك, ولكن هناك الكثير من تطبيقات حول.

هل الكتابة الخاصة بك FormsAuth سمة العمل ؟ إذا كان الأمر كذلك ، في OnActionExecuting الطريقة ، يمكنك الحصول على تمرير FilterExecutingContext.يمكنك استخدام هذا أن تمر مرة أخرى 401 رمز.

public class FormsAuth : ActionFilterAttribute
{
    public override void OnActionExecuting(FilterExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.StatusCode = 401;
        filterContext.Cancel = true;
    }
}

هذا يجب أن تعمل.أنا لست متأكدا مما إذا كنت كتبت FormsAuth السمة أو إذا كنت حصلت عليه من مكان آخر.

أنا لم تستخدم AuthorizeAttribute الذي يأتي في معاينة 4 حتى الآن.أنا تدحرجت بلدي ، لأن لقد تم استخدام إطار MVC منذ أول CTP.أخذت نظرة سريعة على السمة في عاكس يفعل ما ذكرت أعلاه داخليا ، باستثناء استخدام عرافة ما يعادل 401.سوف تحتاج إلى مزيد من البحث المكالمة ، لنرى أين الاستثناء هو القبض ، لأنه يحتمل أكثر من ذلك حيث يتم عمل إعادة توجيه.هذا هو وظيفة سوف تحتاج إلى تجاوز.أنا لست متأكدا مما إذا كان يمكنك أن تفعل ذلك, ولكن أنا عندما أجد أنه وتعطيك العمل إلا إذا Haacked يرى هذا والمشاركات ذلك بنفسه.

لم غوغلينغ بعض و هذا هو ما جئت به:


    HttpContext.Current.Response.StatusCode = 401;

غير متأكد ما إذا كان يعمل أو لا, لم أجربها.في الحالتين الأمر يستحق المحاولة ، أليس كذلك ؟ :)

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