2012-05-21 12 views
5

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

एपीआई दोनों वेब और डेस्कटॉप ग्राहकों

एक तरह से इसे करने में मुझे के बारे में सोचा के लिए सुलभ होना चाहिए, वे पैरामीटर के रूप में साथ अपने उपयोगकर्ता नाम/पासवर्ड पारित लेकिन यह फ्लॉप बहुत सुरक्षित/सही नहीं लगता है ?. उदाहरण के लिए: api/products/GetById/750?username=bob&pass=123

उत्तर

7

आप अपने नियंत्रकों/कार्यों को सजाने के लिए AuthorizeAttribute इस्तेमाल कर सकते हैं।

[Authorize] 
public IEnumerable<Product> Get() {...} 

यह आपके संसाधनों को केवल प्रमाणित उपयोगकर्ताओं के लिए उपलब्ध ही सीमित कर सकता है।

वास्तविक प्रमाणीकरण विधि एक और कहानी है। डिफ़ॉल्ट रूप से वेब एपीआई कुकी-आधारित एएसपी.नेट फॉर्म प्रमाणीकरण का उपयोग करता है, जो एपीआई सीधे एचटीएमएल + जेएस वेब क्लाइंट से खपत होने पर अच्छा होता है।

दूसरी ओर अपने एपीआई, डेस्कटॉप/मोबाइल ऐप या प्लगइन आधार वेब ग्राहक द्वारा खपत होने के लिए HTTP मूल प्रमाणीकरण का उपयोग कर बेहतर हो सकता है के रूप में आप कुकी प्रबंधित करने की नहीं होती है अगर (इस परिदृश्य में SSL का उपयोग करने के लिए याद)।

आप से पता चलता है जो बुनियादी प्रमाणीकरण ASP.NET सदस्यता और भूमिका प्रदाताओं का उपयोग करता है http प्रदान करने के लिए कैसे http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-membership-provider/ पर अपने ब्लॉग पोस्ट को देखने के लिए चाहते हो सकता है।

+0

यह बहुत अच्छा है, लेकिन क्लाइंट अपने क्रेडेंशियल को अधिकृत करने के लिए कैसे इनपुट करेगा? क्या मुझे एक विधि का पर्दाफाश करना होगा? – CallumVass

+0

यह आपके द्वारा उपयोग किए जा रहे क्लाइंट प्लैटफॉर्म पर निर्भर करता है। उदाहरण के लिए .NET WebClient का उपयोग करके आप शायद WebClient.Credentials प्रॉपर्टी सेट करेंगे। –

3

निश्चित रूप से क्वेरी स्ट्रिंग के माध्यम से नहीं।

एएसपी.NET सदस्यता का उपयोग क्यों नहीं करें? MSDN

वैकल्पिक रूप से, आप अपना खुद का प्रमाणीकरण लिख सकते हैं और जांच सकते हैं कि उत्पादों की सूची वापस करने से पहले उपयोगकर्ता के पास उचित अनुमतियां हैं या नहीं।

http://sixgun.wordpress.com/2012/02/29/asp-net-web-api-basic-authentication/

+0

हाँ, लेकिन कैसे वे सदस्यता प्रदाता के लिए अपने क्रेडेंशियल्स में से होकर गुजरेगा/मेरे एपीआई तक पहुंचने से पहले कस्टम प्रमाणीकरणकर्ता? – CallumVass

+1

@DarrenDavies नहीं REST के साथ नहीं, आप वेब एपीआई का उपयोग नहीं कर सकते हैं। – mattytommo

+1

@ बिफबैफबॉफ़ - इसे देखें: http://sixgun.co.uk/blog/2012/02/29/asp-net-web-api-basic-authentication/ –

3
  • आप एक एसएसएल फ़ोल्डर के अंदर अपने एपीआई होस्ट करना चाहते हैं। यही कारण है कि सभी संचार (वेब ​​पर अपने क्रेडिट कार्ड # भेजने के रूप में ही)

  • तुम भी यूआरएल एन्क्रिप्ट कर सकते हैं तो यह इस तरह पढ़ा जाएगा एन्क्रिप्ट करेगा:

    api/products/GetById/750?u=828s388332e328e38&p=328e23e2i38324r423ur29834

    लेकिन इस के बाद से एक चुनौती का प्रतिनिधित्व अब आपको अपने क्लाइंट

  • द्वारा उपयोग की गई एन्क्रिप्शन विधि को सिंक करना होगा, आप टोकन का भी उपयोग कर सकते हैं, और अपने क्लाइंट को समाप्ति तिथि के साथ टोकन पुनर्प्राप्त कर सकते हैं। टोकन की अवधि समाप्त हो जाती है (1 घंटा, या 1 दिन, आदि)। तो URL ऐसा दिखाई देगा कर सकते हैं:

    api/products/GetById/750?token=1241824123yxxcn2r348

  • तुम भी निजी/सार्वजनिक कुंजी का उपयोग कर सकते हैं: MSDN

+0

एसएसएल संचार को एन्क्रिप्ट करने के लिए है, लेकिन वास्तव में प्राधिकरण या प्रमाणीकरण के साथ कुछ भी नहीं है, जो सवाल था। –

+1

हालांकि प्रश्न का शीर्षक प्राधिकरण और प्रमाणीकरण के बारे में है, वह ग्राहक से प्रमाण पत्र पारित करने के बारे में चिंतित है। एसएसएल जोखिम को कम करने में मदद करेगा। –

0

उपयोगकर्ता नाम/पासवर्ड संयोजन का उपयोग करना ठीक है, लेकिन क्वेरी स्ट्रिंग द्वारा गुजरने के बजाय, इसे अधिक मानकीकृत तरीके (HTTP मूल प्रमाणीकरण) में करें जो इस जानकारी को संदेश के अनुरोध शीर्षलेख में जोड़ना है।

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(@"https://localhost:8010/api/Customer/1"); 
//Add a header to the request that contains our credentials 
//DO NOT HARDCODE IN PRODUCTION!! Pull credentials real-time from database or other store. 
string svcCredentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user1"+ ":" + "test")); 
req.Headers.Add("Authorization", "Basic " + svcCredentials); 

आप सवाल इसलिए निरीक्षण क्रेडेंशियल्स सर्वर साइड पर कुछ भिन्न है दोनों 'WCF' और 'वेब API' के साथ टैग है: यहाँ क्या कोड कैसा दिखेगा है। हालांकि, आप अनिवार्य रूप से 'प्राधिकरण' शीर्षलेख खींचते हैं और यह देखने के लिए प्रमाण-पत्र का निरीक्षण करते हैं कि उपयोगकर्ता प्रमाणित और अधिकृत है या नहीं। अगर वे प्रमाणीकृत नहीं हैं, तो एक HTTP 401 संदेश वापस लौटें।

WCF आराम के लिए आधारित आईआईएस में सेवाओं की मेजबानी की, आप मेरा एक ब्लॉग पोस्ट से एक पूर्ण विस्तृत उदाहरण देख सकते हैं:

Using Basic Authentication In REST Based Services Hosted in IIS