जब यह पहली बार विकसित किया गया था, तो System.Web.Mvc.AuthorizeAttribute सही काम कर रहा था - HTTP विनिर्देश के पुराने संशोधनों ने "अनधिकृत" और "अनअथेंटेड" दोनों के लिए स्थिति कोड 401 का उपयोग किया।
मूल विनिर्देश से:
यदि अनुरोध में पहले से ही प्राधिकरण क्रेडेंशियल शामिल हैं, तो 401 प्रतिक्रिया इंगित करती है कि प्रमाणीकरण उन क्रेडेंशियल्स के लिए मना कर दिया गया है।
वास्तव में, आप भ्रम को वहीं देख सकते हैं - यह "प्रमाणीकरण" शब्द का उपयोग करता है जब इसका अर्थ "प्रमाणीकरण" होता है। हालांकि, हर रोज़ अभ्यास में, यह 403 को वापस करने के लिए अधिक समझ में आता है जब उपयोगकर्ता को प्रमाणित किया जाता है लेकिन अधिकृत नहीं है। यह संभावना नहीं है कि उपयोगकर्ता के पास क्रेडेंशियल्स का दूसरा सेट होगा जो उन्हें एक्सेस प्रदान करेगा - खराब उपयोगकर्ता अनुभव।
अधिकांश ऑपरेटिंग सिस्टम पर विचार करें - जब आप किसी ऐसी फ़ाइल को पढ़ने का प्रयास करते हैं जिसकी आपको अनुमति नहीं है, तो आपको लॉगिन स्क्रीन नहीं दिखाई जाती है!
शुक्र है, अस्पष्टता को दूर करने के लिए HTTP विनिर्देशों (जून 2014) को अपडेट किया गया था।
"हाइपर टेक्स्ट ट्रांसपोर्ट प्रोटोकॉल (HTTP / 1.1): ऑथेंटिकेशन" (RFC 7235) से:
401 (अनधिकृत) स्थिति कोड इंगित करता है कि अनुरोध लागू नहीं किया गया है क्योंकि इसमें लक्ष्य संसाधन के लिए वैध प्रमाणीकरण क्रेडेंशियल्स का अभाव है।
"हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल (HTTP / 1.1): शब्दार्थ और सामग्री" (RFC 7231) से:
403 (निषिद्ध) स्थिति कोड इंगित करता है कि सर्वर अनुरोध को समझ गया है लेकिन इसे अधिकृत करने से इनकार करता है।
दिलचस्प बात यह है कि ASP.NET MVC 1 को उस समय जारी किया गया था जब AuthorizeAttribute का व्यवहार सही था। अब, व्यवहार गलत है - HTTP / 1.1 विनिर्देश तय किया गया था।
ASP.NET के लॉगिन पृष्ठ को पुनर्निर्देशित करने का प्रयास करने के बजाय, स्रोत पर समस्या को ठीक करना आसान है। आप अपनी वेबसाइट के डिफ़ॉल्ट नामस्थान (यह बहुत महत्वपूर्ण है) में एक ही नाम ( AuthorizeAttribute
) के साथ एक नई विशेषता बना सकते हैं, फिर कंपाइलर इसे MVC के मानक एक के बजाय स्वचालित रूप से उठाएगा। बेशक, आप हमेशा विशेषता को एक नया नाम दे सकते हैं यदि आप उस दृष्टिकोण को लेना चाहते हैं।
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAuthenticated)
{
filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}