2012-07-20 27 views
7

के बजाय रिक्त पृष्ठ प्राप्त करना मेरे पास आईआईएस 6 पर तैनात विंडोज प्रमाणीकरण के साथ एक एएसपी.नेट एमवीसी 3 एप्लीकेशन है। जब एक प्रमाणीकृत उपयोगकर्ता किसी लिंक पर क्लिक करता है जिसे वे देखने के लिए अधिकृत नहीं हैं, तो उन्हें अपेक्षित के रूप में अपना उपयोगकर्ता नाम और पासवर्ड (ब्राउज़र संवाद में, पृष्ठ नहीं) दर्ज करने के लिए कहा जाता है।401 त्रुटि पृष्ठ

हालांकि, रद्द करने के बाद या 401 अनधिकृत पृष्ठ देखने के बजाय, तीन बार अवैध क्रेडेंशियल्स दर्ज करने के बाद, मुझे एक खाली सफेद पृष्ठ दिखाई देता है।

फिडलर को देखते हुए, रद्द करने पर क्लिक करने के बाद तीन अनुरोध/प्रतिक्रियाएं हैं।

  1. ASP.NET पहुंच अस्वीकृत कर दी संदेश (401,2)

    HTTP/1.1 401 अनधिकृत तिथि: शुक्र, 20 जुला 2012 14:34:21 GMT सर्वर यहाँ प्रतिक्रिया सारांश और हेडर हैं : माइक्रोसॉफ्ट-आईआईएस/6.0 WWW-प्रमाणित: निगोशिएट WWW-प्रमाणित: NTLM एक्स संचालित-द्वारा: ASP.NET एक्स ASPNET-संस्करण: 4.0.30319 कैश-नियंत्रण: निजी सामग्री प्रकार: पाठ/html; charset = utf-8 सामग्री-लंबाई: 1701 प्रॉक्सी-समर्थन: सत्र-आधारित-प्रमाणीकरण

  2. IIS इस पृष्ठ को देखने के लिए अधिकृत नहीं हैं (401,1)

    HTTP/1.1 401 अनधिकृत सामग्री- लंबाई: 1539 सामग्री प्रकार: पाठ/html सर्वर: माइक्रोसॉफ्ट आईआईएस/6.0 WWW-प्रमाणित: NTLM TlRMTVNTUAACAAAADAAMADgAAAAF ... (संक्षिप्तता के लिए छोड़े गए) एक्स संचालित-द्वारा: ASP.NET तिथि: शुक्र, 20 जुलाई 2012 14:34:21 GMT प्रॉक्सी-समर्थन: सत्र-आधारित-प्रमाणीकरण

  3. खाली प्रतिक्रिया

    HTTP/1.1 401 अनधिकृत तिथि: शुक्र, 20 जुला 2012 14:34:21 GMT सर्वर: माइक्रोसॉफ्ट आईआईएस/6.0 WWW-प्रमाणित: निगोशिएट WWW-प्रमाणित: NTLM एक्स-संचालित-द्वारा: ASP.NET एक्स ASPNET-संस्करण: 4.0.30319 एक्स AspNetMvc-संस्करण: 3.0 कैश-नियंत्रण: निजी सामग्री-लंबाई: 0 प्रॉक्सी-समर्थन: सत्र-आधारित-प्रमाणीकरण

मैं इसे 401 त्रुटि पृष्ठ प्रदर्शित करने के लिए कैसे प्राप्त करूं?

अद्यतन 1:

यहाँ मेरी web.config त्रुटियों खंड है।

<customErrors mode="RemoteOnly" defaultRedirect="~/Error" /> 

मैं भी HandleErrorAttribute का उपयोग कर रहा हूं।

मुझे संदेह है कि आईआईएस एएसपी.नेट के बजाय खाली पृष्ठ लौटा रहा है, लेकिन मुझे यकीन नहीं है कि इसे कैसे साबित किया जाए।

अद्यतन 2:

यह दिलचस्प है।अगर मैं खाली पृष्ठ रीफ्रेश करता हूं, तो मुझे लगता है कि एएसपी.नेट एक्सेस अस्वीकृत संदेश है।

+0

बस एक अनुमान है लेकिन क्या यह उन्हें वापस उपयोगकर्ता नाम और पासवर्ड पृष्ठ पर रीडायरेक्ट करने का प्रयास कर रहा है क्योंकि वे अभी भी अधिकृत नहीं हैं? और चूंकि यह पहले से ही सोचता है कि यह उपयोगकर्ता को संभाला गया है, दृश्य में प्रदर्शित करने के लिए कुछ भी नहीं है? –

+0

यह लॉगिन पृष्ठ नहीं है, इसका ब्राउज़र लॉगिन संवाद है। – jrummell

+0

आह क्षमा करें उस भाग को नहीं देखा। तीसरे प्रयास के बाद आप उन्हें 401 पेज पर रीडायरेक्ट कर रहे हैं? यदि नहीं, तो आप एक ही पृष्ठ पर रहते हैं लेकिन आपको कोई सामग्री प्रदर्शित नहीं होती है क्योंकि सर्वर कोई भी नहीं भेजता है। –

उत्तर

1

@AndrewHagner के सुझाव के रूप में 401 पुनर्निर्देशन को देखने के बाद मैं इस काम के साथ आया था। यह this answer पर आधारित है। मैंने AuthorizeAttribute लागू किया और HandleUnauthorizedRequest() ओवररोड किया।

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
    if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
    { 
     var authenticatedUnauthorizedRouteValues = 
       new RouteValueDictionary(new {controller = "Error", action = "Index"}); 

     filterContext.Result = new RedirectToRouteResult(authenticatedUnauthorizedRouteValues); 
     filterContext.Controller.TempData["message"] = 
       "You are not authorized to view this page."; 
    } 
    else 
    { 
     base.HandleUnauthorizedRequest(filterContext); 
    } 
} 

तो जैसा कि मैं समझता हूँ, इस आईआईएस भेजे जाने से पहले MVC पाइप लाइन में अनधिकृत अनुरोध पकड़ लेंगे। यह मुझे उपयोगकर्ता के अनुकूल नहीं अधिकृत पृष्ठ पर रीडायरेक्ट करने का मौका देता है।

+0

मैं अभी भी जानना चाहता हूं कि मुझे इसके बिना एक खाली पृष्ठ क्यों मिल रहा था। – jrummell

+2

बस आपको लाइन 3 'अगर (filterContext.HttpContext.User.Identity.Is प्रमाणीकृत)' की आवश्यकता है, तो 'if (! FilterContext.HttpContext.User.Identity.Is प्रमाणीकृत)' – Azerothian

+0

अच्छी पकड़ है! मैंने कोड अपडेट किया। – jrummell

0

आपको अपने वेब.config में सेटिंग करने का प्रयास करना चाहिए ताकि उपयोगकर्ता को इस तरह से अनधिकृत पृष्ठ पर रीडायरेक्ट करने के लिए एक नियम दर्ज किया जा सके।

<System.Web> 
    //map all the erros presented in the application to the error.aspx webpage 
    <customErrors mode="RemoteOnly" defaultRedirect ="~/error.aspx"> 
    //redirect the user to a Error401.pasx Page after the server get an 401 Error 
    <error statusCode="401" redirect="Error401.aspx" /> 
    </customErrors> 
<System.Web> 

मुझे आशा है कि यह आपके लिए काम करता है।

+0

को लागू करने के लिए यह बहुत अधिक नहीं था, इससे कोई फर्क नहीं पड़ता। (और '' 'customerrors>') का बच्चा होना चाहिए – jrummell

+0

आपका दायां @ jrummell, धन्यवाद! –