2013-09-30 9 views
46

मैं निम्नलिखित दो सुलभ बूलियन्स देखा है:मुझे यह जांचना चाहिए कि उपयोगकर्ता को MVC5 में प्रमाणित किया गया है या नहीं?

  • System.Web.Mvc.Controller.User.Identity.IsAuthenticated
  • System.Web.Mvc.Controller.Request.IsAuthenticated

इन के बीच एक अंतर है। वे दोनों एक ही काम करते हैं, इसलिए मुझे यकीन नहीं है कि किस का उपयोग करना है।

मुझे क्या करना चाहते हैं:

@if (User.Identity.IsAuthenticated) { 
    if (User.IsInRole("Admin")) { 
    @Html.ActionLink("Admin", "AdminController")   
    } 
} 

या

@if (Request.IsAuthenticated) { 
    if (User.IsInRole("Admin")) { 
    @Html.ActionLink("Admin", "AdminController")   
    } 
} 

ऊपर काम के दोनों समान रूप से अच्छी तरह से चाहेंगे?

उत्तर

60

कोई अंतर नहीं है। फर्क सिर्फ इतना है कि अगर उपयोगकर्ता प्रमाणीकृत नहीं है User.Identity अशक्त हो सकता है और दूसरे दृष्टिकोण के साथ, आंतरिक रूप से इसके लिए एक जांच है और सुरक्षित है, जबकि इस प्रकार आप एक एनआरई मिल सकता है, है।

यहाँ कैसे Request.IsAuthenticated पद्धति लागू होता है:

public bool IsAuthenticated 
{ 
    get 
    { 
     return this._context.User != null && 
       this._context.User.Identity != null && 
       this._context.User.Identity.IsAuthenticated; 
    } 
} 

मूल रूप से यह थोड़ा पहले एक अधिक सुरक्षित है।

+0

मैं एक और परीक्षण करना चाहते थे उल्लेख करना होगा: "अगर (User.IsInRole (" व्यवस्थापक ")) {}" ऊपर परीक्षा उत्तीर्ण की है। अनुरोध के अंदर उस परीक्षण को शामिल करना ठीक होगा। प्रमाणीकृत? – Melina

+0

मुझे नहीं लगता कि आपको 'Request.Is प्रमाणीकृत' में परीक्षण लपेटने की आवश्यकता है। कॉलिंग 'अगर (User.IsInRole ("Admin")) {} 'ठीक होना चाहिए। –

+0

धन्यवाद मैं जवाब स्वीकार करूंगा। –

2

IsAuthenticated संपत्ति निर्धारित करने के लिए वर्तमान अनुरोध प्रमाणीकृत किया गया है। अगर इसे प्रमाणित नहीं किया गया है, तो अनुरोध किसी दूसरे पृष्ठ पर रीडायरेक्ट किया जाता है जहां उपयोगकर्ता वेब प्रमाणन में अपने प्रमाण-पत्र दर्ज कर सकते हैं। यह एक सामान्य तकनीक है जो किसी एप्लिकेशन के लिए डिफ़ॉल्ट पृष्ठ में उपयोग की जाती है।

लेकिन जब यह User.Identity.IsAuthenticated

उपयोगकर्ता संपत्ति गुण और IPrincipal इंटरफेस के तरीकों के लिए कार्यक्रम संबंधी पहुँच प्रदान करता है के लिए आता है। क्योंकि ASP.NET पृष्ठों System.Web नाम स्थान (जो HttpContext वर्ग शामिल है) के लिए एक डिफ़ॉल्ट संदर्भ दिया, आप HttpContext को पूरी तरह से योग्य वर्ग संदर्भ का उपयोग किए बिना एक .aspx पृष्ठ पर HttpContext के सदस्यों को संदर्भित कर सकते। उदाहरण के लिए, आप उस उपयोगकर्ता का नाम प्राप्त करने के लिए User.Identity.Name का उपयोग कर सकते हैं जिसकी ओर से वर्तमान प्रक्रिया चल रही है। हालांकि, अगर आप एक ASP.NET कोड-पीछे मॉड्यूल से IPrincipal के सदस्यों का उपयोग करना चाहते हैं, तो आप मॉड्यूल में System.Web नाम स्थान के लिए एक संदर्भ और दोनों वर्तमान में सक्रिय अनुरोध/प्रतिक्रिया संदर्भ के लिए पूरी तरह से योग्य संदर्भ में शामिल करना चाहिए और System.Web में क्लास जिसे आप उपयोग करना चाहते हैं। उदाहरण के लिए, एक कोड-पीछे पेज में आप पूरी तरह से योग्य नाम

+0

_ अगर इसे प्रमाणित नहीं किया गया है, तो अनुरोध किसी अन्य पृष्ठ पर रीडायरेक्ट किया जाता है जहां उपयोगकर्ता वेब प्रमाण पत्र में अपने क्रेडेंशियल्स दर्ज कर सकते हैं ..._ मुझे यह नहीं मिलता ... एक शर्त क्लाइंट useragent को पुनर्निर्देशित नहीं कर सकती है ?! – WoIIe

+1

_ उपयोगकर्ता संपत्ति प्रॉपर्टीज और आईप्रिनियल इंटरफ़ेस के तरीकों के लिए प्रोग्रामेटिक पहुंच प्रदान करती है ._ ... एक इंटरफ़ेस गुणों को लागू नहीं कर सकता है! – WoIIe

संबंधित मुद्दे

 संबंधित मुद्दे