asp.net mvc - प्रमाणीकरण और प्रमाणीकरण विफलताओं के लिए AuthorizeAttribute लॉगिन पृष्ठ पर रीडायरेक्ट क्यों करता है?




asp.net-mvc authentication (4)

एएसपी.नेट एमवीसी में, आप AuthorizeAttribute साथ एक नियंत्रक विधि को चिह्नित कर सकते हैं, जैसे:

[Authorize(Roles = "CanDeleteTags")]
public void Delete(string tagName)
{
    // ...
}

इसका अर्थ यह है कि, यदि वर्तमान में लॉग-इन उपयोगकर्ता "CanDeleteTags" भूमिका में नहीं है, तो नियंत्रक विधि कभी नहीं कहा जाएगा।

दुर्भाग्यवश, असफलताओं के लिए, AuthorizeAttribute HttpUnauthorizedResult देता है, जो हमेशा HTTP स्थिति कोड 401 देता है। इससे लॉगिन पृष्ठ पर पुनर्निर्देशन होता है।

यदि उपयोगकर्ता लॉग इन नहीं है, तो यह सही समझ में आता है। हालांकि, यदि उपयोगकर्ता पहले से लॉग इन है, लेकिन आवश्यक भूमिका में नहीं है, तो यह उन्हें वापस लॉगिन पृष्ठ पर भेजने में भ्रमित है।

ऐसा लगता है कि AuthorizeAttribute प्रमाणीकरण और प्रमाणीकरण conflates।

यह एएसपी.नेट एमवीसी में थोड़ी सी निगरानी की तरह लगता है, या क्या मुझे कुछ याद आ रही है?

मुझे एक DemandRoleAttribute बनाना है जो DemandRoleAttribute को अलग करता है। जब उपयोगकर्ता प्रमाणीकृत नहीं होता है, तो यह लॉगिन पृष्ठ पर भेजकर HTTP 401 देता है। जब उपयोगकर्ता लॉग इन होता है, लेकिन आवश्यक भूमिका में नहीं है, तो यह इसके बजाय एक NotAuthorizedResult बनाता है। वर्तमान में यह एक त्रुटि पृष्ठ पर रीडायरेक्ट करता है।

निश्चित रूप से मुझे यह करने की ज़रूरत नहीं थी?


अपने ग्लोबल.एक्सएक्स फ़ाइल के Application_EndRequest हैंडलर में इसे अपने आप में आज़माएं

if (HttpContext.Current.Response.Status.StartsWith("302") && HttpContext.Current.Request.Url.ToString().Contains("/<restricted_path>/"))
{
    HttpContext.Current.Response.ClearContent();
    Response.Redirect("~/AccessDenied.aspx");
}

इसे अपने लॉगिन पेज_ लोड फ़ंक्शन में जोड़ें:

// User was redirected here because of authorization section
if (User.Identity != null && User.Identity.IsAuthenticated)
    Response.Redirect("Unauthorized.aspx");

जब उपयोगकर्ता को रीडायरेक्ट किया जाता है लेकिन पहले ही लॉग इन होता है, तो यह अनधिकृत पृष्ठ दिखाता है। अगर वे लॉग इन नहीं हैं, तो यह लॉगिन पेज से गुज़रता है और दिखाता है।


दुर्भाग्यवश, आप एएसपी.नेट फॉर्म प्रमाणीकरण के डिफ़ॉल्ट व्यवहार से निपट रहे हैं। यहां एक कार्यवाही है (मैंने कोशिश नहीं की है) यहां चर्चा की गई है:

http://www.codeproject.com/KB/aspnet/Custon401Page.aspx

(यह एमवीसी के लिए विशिष्ट नहीं है)

मुझे लगता है कि ज्यादातर मामलों में सबसे अच्छा समाधान उपयोगकर्ता से पहले वहां पहुंचने की कोशिश करने से पहले अनधिकृत संसाधनों तक पहुंच प्रतिबंधित करना है। लिंक या बटन को हटाकर / भूरे रंग से निकालकर जो उन्हें इस अनधिकृत पृष्ठ पर ले जा सकता है।

एक अनधिकृत उपयोगकर्ता को पुनर्निर्देशित करने के लिए यह निर्दिष्ट करने के लिए विशेषता पर एक अतिरिक्त पैरामीटर होना शायद अच्छा होगा। लेकिन इस बीच, मैं प्राधिकरण एट्रिब्यूट को सुरक्षा नेट के रूप में देखता हूं।


मैंने हमेशा सोचा कि यह समझ में आया है। यदि आप लॉग इन हैं और आप उस पृष्ठ को हिट करने का प्रयास करते हैं जिसके लिए आपकी कोई भूमिका नहीं है, तो आपको लॉगिन स्क्रीन पर अग्रेषित किया जाता है जिससे आप उस उपयोगकर्ता के साथ लॉग इन कर सकते हैं जिसकी भूमिका है।

आप लॉगिन पेज पर तर्क जोड़ सकते हैं जो यह देखने के लिए जांचता है कि उपयोगकर्ता पहले से ही प्रमाणित है या नहीं। आप एक दोस्ताना संदेश जोड़ सकते हैं जो बताता है कि उन्हें फिर से क्यों वापस बुलाया गया है।





authorization