2011-12-20 15 views
8

पर प्राधिकरण विशेषता का उपयोग कैसे करें मैंने एमवीसी पर [Authorize] विशेषता का उपयोग करने के लिए पढ़ा है, आपको बस इसे एक क्रिया या नियंत्रक वर्ग पर रखना होगा जिसे आप सुरक्षित करना चाहते हैं।एमवीसी 3

मेरा प्रश्न है: Authorize विशेषता कैसे पता है कि कोई उपयोगकर्ता लॉग है या नहीं? क्या मुझे Authorize पता करने के लिए कोई उपयोगकर्ता ऑब्जेक्ट प्रदान करना है कि कोई उपयोगकर्ता अधिकृत है या नहीं?

उत्तर

15

यह विशेषता HttpContext.User.Identity.IsAuthenticated पर देखकर काम करती है।

यदि आप फॉर्म्स प्रमाणीकरण जैसे कुछ का उपयोग कर रहे हैं, तो यह सही होगा यदि उपयोगकर्ता के पास उनकी मशीन पर वैध फॉर्म प्रमाणीकरण कुकी है (जिसे आप FormsAuthentication.SetAuthCookie का उपयोग करके जोड़ सकते हैं)।

आप Authorize के आंतरिक कामकाज में रुचि रखते हैं, इस प्रकाशित माइक्रोसॉफ्ट के स्रोत कोड से है:

protected virtual bool AuthorizeCore(HttpContextBase httpContext) { 
     if (httpContext == null) { 
      throw new ArgumentNullException("httpContext"); 
     } 

     IPrincipal user = httpContext.User; 
     if (!user.Identity.IsAuthenticated) { 
      return false; 
     } 

     if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)) { 
      return false; 
     } 

     if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole)) { 
      return false; 
     } 

     return true; 
    } 

यहाँ some more info on FormsAuthentication है।

+0

बहुत बहुत धन्यवाद। महान संसाधन! – Jose3d

2

डिफ़ॉल्ट रूप से अधिकृत विशेषता वर्ग httpcontext को तर्क के रूप में लेता है। जब बुलाया जाता है। इसके बाद यह HttpContext.User.Identity.Is प्रमाणीकृत बूल मान की जांच करता है और तदनुसार कार्य करता है। यह केवल तभी काम करता है जब आप फॉर्म प्रमाणीकरण का उपयोग करते हैं। यदि आप अपना लॉगिन लॉजिक (उदाहरण के लिए सत्र ऑब्जेक्ट में) का उपयोग कर रहे हैं, तो आप प्राधिकृत विशेषता से एक वर्ग प्राप्त कर सकते हैं और इसे कॉल कर सकते हैं।

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true,  AllowMultiple = true)] 
public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     clsSession sess = httpContext.Session["Current"] as clsSession; 
     if (sess.IsLogin) return true; 
     return false; 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new ViewResult { ViewName = "Unauthorized" }; 
    } 
} 

तो फिर तुम इस तरह इस वर्ग का उपयोग कर सकते हैं:

[MyAuthorize] 
public ActionResult Index() 
{ 
    return View(); 
} 

यह काम करेंगे। आप सभी नियंत्रक कार्यों में [प्राधिकरण] के बजाय [MyAuthorize] का उपयोग कर सकते हैं। यदि यह झूठा लौटाता है, तो यह एक दृश्य वापस करेगा (इस मामले में "अनधिकृत")। दृश्य नाम कुछ भी हो सकता है और दृश्य/साझा फ़ोल्डर में स्थित हो सकता है।