2010-02-05 11 views
22

के अंदर उपयोगकर्ता को अधिकृत किया गया है, तो आमतौर पर मैं [Authorize] के साथ अपनी क्रियाओं की रक्षा करता हूं लेकिन इस बार मुझे यह जांचने की आवश्यकता है कि कोई उपयोगकर्ता कार्रवाई के अंदर अधिकृत है या नहीं।कार्रवाई कैसे करें

जैसे

if(userIsAuthorized) { 
    //do stuff 
} 
else { 
    //return to login page 
} 

मेरा मानना ​​है कि मैं उपयोग कर रहा हूँ 'फॉर्म्स प्रमाणीकरण'

यह सवाल तरह this के लिए इसी तरह की है, लेकिन दिए गए उत्तर से कोई भी काम करने के लिए लग रहा था।

संपादित करें: मैं कुछ और digging- किया है ऐसा लगता है कि अगर मैं एक कार्रवाई [Authorize] है, User.Identity सेट किया गया है पर ब्रेकपाइंट, लेकिन यह बिना क्रिया पर, User.Identity खाली है, भले ही मैं जाऊँ

+0

मैंने हैक-आश वर्कअराउंड का उपयोग करके अपनी समस्या तय की है, मुझे लगता है कि आपके उत्तर सही हैं और यह प्रमाणीकरण के मेरे अजीब कार्यान्वयन के कारण है कि चीजें अजीब हैं ... – elwyn

उत्तर

42

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

if (User.IsInRole("Administrators")) { ... } 

User उदाहरण के एक सार्वजनिक संपत्ति है:

if (User.Identity.IsAuthenticated) { ... } 

आपको कुछ करने की भूमिका-विशिष्ट कोशिश कर रहे हैं Controller कक्षा, इसलिए आपके पास हमेशा लिखने वाले नियंत्रक से इसका उपयोग होता है। यदि आपके पास कोई उपयोगकर्ता लॉग इन नहीं है तो User और के लिए User.Identity के लिए होना चाहिए, इसलिए नल की जांच करने की चिंता न करें।

+0

फिर से, केवल 'सत्य' देता है अगर किसी '[प्राधिकरण]' 'डी' एक्शन – elwyn

+0

@elwyn के भीतर उपयोग किया जाता है: मुझे विश्वास नहीं है कि यह सही है। मैंने इसे यहां '[प्राधिकृत]' विशेषता के बिना किसी क्रिया पर और 'User.Identity.Is प्रमाणीकृत' 'सत्य 'का परीक्षण किया है। क्या आप सुनिश्चित हैं कि जब आप इसका परीक्षण कर रहे हों तो सत्र वास्तव में लॉग इन होता है? – Aaronaught

+0

@Aaronaught हाँ, बस डबल (ट्रिपल) चेक किया गया है, कोशिश करते समय निश्चित रूप से लॉग इन किया गया है, और अभी भी झूठी – elwyn

1

मुझे पहले यह पता लगाने का सुझाव है कि आप किस प्रकार के प्रमाणीकरण का उपयोग कर रहे हैं। ;)

आपके द्वारा पोस्ट किया गया उत्तर सही है। मुझे [प्राधिकरण] विशेषता और संबंधित एक्शनफिल्टर कोड एमवीसी के चारों ओर पोकिंग याद रखने से मुझे आंतरिक रूप से पेज.उसर.इडेन्टिटी कहते हैं। यह केवल उन कोड उदाहरणों की तरह प्रमाणित है।

+0

डबल चेक किया गया है और यह फॉर्म है प्रमाणीकरण – elwyn

3

Request.IsAuthenticated जो आप करने की कोशिश कर रहे हैं उसके लिए काम करना चाहिए।

+3

यदि मैं इसे '[प्राधिकरण]' से सजाए गए एक्शन पर करता हूं तो यह ठीक काम करता है, हालांकि अगर मैं इस क्रिया (इसे [अधिकृत] के साथ सजाया नहीं जाता) पर करता हूं तो यह हमेशा गलत होता है, भले ही मैं लॉग इन हूं या नहीं । – elwyn

1

की तरह इस एक विशेषता बनाएँ: OnActionExecuting कार्रवाई

 public class IsAuthenticatedAttribute : ActionFilterAttribute 
     { 
      public override void OnActionExecuting(ActionExecutingContext filterContext) 
      { 
       //do your validations here. and redirect to somewhere if needed. 
       filterContext.HttpContext.Response.Redirect("/") //this will send user to home. 
      } 
     } 

प्रत्येक कार्य जहां जांच करने की आवश्यकता पर से अन्य कोड से पहले पहले निष्पादित हो जाएगा, इस तरह विशेषता जोड़ें:

[IsAuthenticatedAttribute] 
public ActionResult ActionName(parameters?) 
{ 
    // no need to worry about checking here. 
    //do you action things 
} 

संपादित करें: यह अभी भी कार्रवाई को पूरा करता है और फिर इसे पुनर्निर्देशित करता है। इतना उपयोगी नहीं है।