2013-05-21 13 views
8

मैं एक एएसपीएनटी एमवीसी वेब एपीआई एप्लीकेशन बना रहा हूं और यह सुनिश्चित नहीं करता कि सदस्यता सामग्री कैसे करें।भूमिका प्रदाता/सदस्यता? एएसपीनेट वेब एपीआई में कैसे करें?

मेरे वर्तमान परियोजना में मैं इस

मेरा अपना Users Table और Role Table मैं asp.net सदस्यता उपयोग नहीं कर रहा है क्योंकि यह बहुत अधिक सामान लाता है और फिट नहीं करता है कैसे मैं अपने डेटाबेस डिजाइन करने के लिए (चाहते मैं यह कर सकते हैं के लिए यह लेकिन यह सिर्फ ज्यादा काम करने के लिए की तरह लगता है)

एक userकई भूमिकाओं हो सकता है और एक roleकई उपयोगकर्ताओं हो सकता है।

मैं डेटाबेस में लगभग सभी कॉल करने के लिए ईएफ का उपयोग कर रहा हूं।

पिछली परियोजनाओं में मैंने अपना खुद का Authorize Attribute बनाया है जो मेरे डेटाबेस पर अपना स्वयं का कॉल करता है और यह देखने के लिए जांच करता है कि उपयोगकर्ता उस नियंत्रक/क्रिया विधि पर क्या अनुमति थी, सही भूमिका में था या नहीं।

कोई सदस्यता प्रदाता नहीं कर रहा है, मैंने User.IsInRole जैसे कुछ अंतर्निहित कार्यों पर खो दिया है। मैं अभी भी User.Identity.Name का उपयोग करने में सक्षम था लेकिन मुझे लगता है कि मेरे द्वारा सेट की गई कुकी के कारण था।

एएसपीनेट एमवीसी 4/वेब एपीआई में अब इसे करने का सबसे अच्छा तरीका क्या है?

जबकि गुगलिंग के दौरान मुझे "सरल स्मृति" मिला लेकिन अभी तक इसमें बहुत कुछ नहीं पढ़ा है।

यदि मैं किसी उपयोगकर्ता को प्रमाणित करता हूं तो क्या मैं अपने वेबपै के साथ User.Identity.Name का उपयोग कर सकता हूं?

उत्तर

4

यहां एक article that describes how to create a custom authorize attribute for Web API's using SimpleMembership है। आपको SimpleMembership का उपयोग करने की आवश्यकता नहीं है, हालांकि यह बहुत लचीला और उपयोग करने में आसान है। आप इस आलेख में वही अवधारणाएं ले सकते हैं और इसके बजाय अपनी सदस्यता सेवा का उपयोग कर सकते हैं, जब तक कि आपकी सेवा यह सत्यापित कर सके कि एक विशिष्ट उपयोगकर्ता भूमिका में है, उपयोगकर्ता को लॉग इन करें और बाहर करें, और सत्यापित करें कि वे प्रमाणीकृत हैं।

यदि आपकी सेवा यह सत्यापित नहीं करती है कि वे प्रमाणीकृत हैं तो आप उपयोगकर्ता का उपयोग कर सकते हैं। Identity.Is प्रमाणीकृत और आप वर्तमान में लॉग इन उपयोगकर्ता नाम प्राप्त करने के लिए User.Identity.Name का उपयोग कर सकते हैं; यह मानते हुए कि आपकी सेवा सही ढंग से Thread.CurrentPrincipal को सेट करती है जब कोई उपयोगकर्ता लॉग इन करता है। यह HttpContext.Current.User को सेट करने के लिए एक अनुशंसित अभ्यास भी है। यदि आप SimpleMembership का उपयोग करते हैं तो निश्चित रूप से आपको इनमें से किसी के बारे में चिंता करने की ज़रूरत नहीं है।

यह कस्टम प्राधिकरण विशेषता आपके फॉर्म को प्रमाणीकरण और बुनियादी प्रमाणीकरण दोनों का समर्थन करती है यदि आप अपने एपीआई को जनता के सामने प्रकट करते हैं। यह एक नियंत्रक पर उपयोग की जाने वाली अधिकृत विशेषता से अलग है जिसमें यह फॉरबिडन का एक HTTP स्थिति कोड देता है यदि अधिकृत नहीं हैं और अनधिकृत हैं यदि वे प्रमाणीकृत नहीं हैं; लॉग-ऑन पेज पर रीडायरेक्ट करने के बजाय।

0

आप अभी भी एक कस्टम सदस्यता प्रदाता लिख ​​सकते हैं और केवल उन विधियों को लागू कर सकते हैं जिन्हें आप उपयोग करना चाहते हैं। जहां तक ​​User.IsInRole चिंतित है, आप RoleProvider कक्षा से विरासत में प्राप्त करके और इसे अपने web.config में पंजीकृत करके कस्टम भूमिका प्रदाता लिख ​​सकते हैं।

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

+0

उपयोगकर्ता के बारे में कैसे .Identity.Name यह एएसपीनेट वेबपीआई में कैसे सेट हो जाता है? पिछले एमवीसी 3 एप में मैंने अपने कस्टम प्राधिकरण में यह विशेषता दी थी: httpContext.User.Identity.Name और फिर मैंने उस नाम के साथ अपनी स्वयं की सेवा परत का उपयोग किया ताकि यह पता चल सके कि उपयोगकर्ता के पास कौन सी अनुमतियां थीं। क्या मैं httpContext.User.Identity.Name का उपयोग कर सकता हूं जैसा कि मैंने सोचा था कि कुकी द्वारा सेट किया गया है? – chobo2

+0

हां, आपके पास एक कस्टम प्राधिकृत विशेषता हो सकती है और संबंधित उपयोगकर्ता को 'Thread.CurrentPrincipal' सेट कर सकते हैं। मैंने लिखा एक नमूना कार्यान्वयन पर एक नज़र डालें जो मूल प्रमाणीकरण के साथ सदस्यता प्रदाता का उपयोग कर रहा है: http://stackoverflow.com/a/11536349/29407 इस उदाहरण में मैंने एक कस्टम प्रतिनिधि हैंडलर का उपयोग किया लेकिन आप एक प्राधिकरण फ़िल्टर का उपयोग कर सकते हैं यदि आप साथ ही चाहते हैं –

+0

कूल जो बहुत उपयोगी है। हालांकि कुछ सवाल मिला। Async क्यों? आपको हैंडलर को पंजीकृत क्यों करना है (मैंने नहीं किया और उपयोगकर्ता। छवि भर दी गई है लेकिन मैंने एसिंक नहीं बनाया है), भूमिकाओं को भरने के लिए क्यों सुनिश्चित करें कि उन्हें कैसे पहुंचाया जाए। – chobo2

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