2012-03-26 14 views
50

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

क्या इस विधि का उपयोग करने वाले वहां कोई उदाहरण परियोजनाएं हैं?

सवाल:

  1. यदि नहीं कैसे मैं [Authorize] विशेषता टोकन को पढ़ने के लिए ठीक करते हैं?
  2. मैं इस टोकन को कैसे उत्पन्न करूं? मुझे नहीं लगता कि मैं फॉर्म प्रमाणीकरण का उपयोग कर सकता हूं क्योंकि यह कुकीज़ का उपयोग करता है।
  3. मैं वास्तविक प्रमाणीकरण को कैसे संभाल सकता हूं, क्लाइंट कच्चे पासवर्ड और उपयोगकर्ता नाम भेजता हूं तो मैं टोकन उत्पन्न करता हूं या कोई अन्य तरीका है?
  4. जब मेरी वेबसाइट इसका उपयोग कर रही है तो मैं कैसे संभाल सकता हूं? मैंने सुना है कि जब ऐप इसका उपयोग कर रहा है, तो डोमेन को प्राप्त करने और इसे अधिकृत करने की तुलना में यह अलग-अलग संभाला जाता है।

उत्तर

42

मुझे लगता है कि टोकन जाने का एक ठोस तरीका होगा। प्रपत्र प्रमाणीकरण वेब के लिए कुकीज़ पर आधारित है। हालांकि सभी गैर ब्राउज़र ग्राहकों के लिए सबसे ज्यादा विचार स्थिति नहीं है।

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

public class AuthorizeTokenAttribute : AuthorizationFilterAttribute 
{  
    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
     if (actionContext != null) 
     {     
       if (!AuthorizeRequest(actionContext.ControllerContext.Request)) 
       { 
        actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) { RequestMessage = actionContext.ControllerContext.Request }; 
       } 
       return; 
     } 
    } 

    private bool AuthorizeRequest(System.Net.Http.HttpRequestMessage request) 
    { 
     bool authorized = false; 
     if (request.Headers.Contains(Constants.TOKEN_HEADER)) 
     {    
      var tokenValue = request.Headers.GetValues("TOKEN_HEADER"); 
      if (tokenValue.Count() == 1) { 
       var value = tokenValue.FirstOrDefault();    
       //Token validation logic here 
       //set authorized variable accordingly 
      }     
     } 
     return authorized; 
    } } 

TOKEN_HEADER सिर्फ एक स्ट्रिंग एक HTTP शीर्ष लेख है कि ग्राहक प्रमाणीकृत अनुरोधों के लिए वापस पास करना चाहिए का प्रतिनिधित्व है।

तो चलो, यह

  1. क्लाइंट अनुरोध सुरक्षित डेटा
  2. ग्राहक अधिकृत नहीं है के माध्यम से चलना एक अनधिकृत स्थिति कोड
  3. ग्राहक साख भेजता प्रमाणित करने के लिए है, जो HTTPS के द्वारा सुरक्षित किया जाना चाहिए के साथ एक प्रतिक्रिया वापस जाने
  4. एक बार सत्यापित होने पर, ग्राहक को HTTP शीर्षलेख के माध्यम से टोकन प्राप्त होता है, या जो भी आपके लिए काम करता है
  5. क्लाइंट फिर से सुरक्षित डेटा का अनुरोध करने का प्रयास करता है, इस बार संलग्न अनुरोध के लिए टोकन
  6. AuthorizeTokenAttribute टोकन को मान्य करेगा और कार्रवाई को निष्पादित करने की अनुमति देगा।

इसके अलावा, जॉन पीटर्सन द्वारा इस पोस्ट को चेक करें। Making your ASP.NET Web API’s secure

+1

धन्यवाद, इससे बहुत मदद मिली, आप प्रमाणीकरण के दौरान टोकन उत्पन्न करने की सलाह कैसे देते हैं? एक guid उत्पन्न और डेटाबेस में उपयोगकर्ता के लिए इसे स्टोर? –

+0

जो आपके ऊपर है, मुझे लगता है। आप एक ग्रिड या हैश या कुछ प्रकार के अद्वितीय मूल्य का उपयोग कर सकते हैं। इस पर निर्भर करता है कि आपके कोड के लिए वास्तव में – cecilphillip

+0

आपकी कोड टिप्पणी में आप "अधिकृत वैरिएबल तदनुसार सेट करें" कहें .... अधिकृत चर सेट किया जाएगा? Request.Properties पर? कहीं और? – ChrisCa

21

एक आरईएसटी सेवा के लिए उपयोगकर्ताओं को प्रमाणीकृत करने के कई तरीके हैं। टोकन का उपयोग करना संभव है लेकिन केवल Basic Authentication का उपयोग करना सरल और मानक और क्रॉस प्लेटफॉर्म के रूप में आप जा सकते हैं।

authentication के साथ भ्रमित न करें। [अधिकृत] विशेषता प्रमाणीकरण के बारे में है, लेकिन उपयोगकर्ता के कुछ अन्य तंत्र का उपयोग करके प्रमाणीकृत होने के बाद ही। प्राधिकरण पहले उचित प्रमाणीकरण किए बिना पूरी तरह बेकार है।

चेक करने के लिए सबसे अच्छा संसाधन Dominick Baier है जो विषय पर एक विशेषज्ञ है।

+0

तो हमेशा इनकोडिंग नाम/पासवर्ड शीर्षक में भेज? –

+0

मूल प्रमाणीकरण के लिए यह हाँ करने का तरीका है। एचटीटीपीएस का उपयोग करें क्योंकि एन्कोडिंग केवल बेस 64 है जो एन्क्रिप्शन नहीं है। – Maurice

+0

डोमिनिक बायर के लेख से लिंक टूटा हुआ है –

2

मैं एक बहुत ही सरल दृष्टिकोण का उपयोग करें:

  1. अपनी अनूठी accessId साथ एक पहुँच प्रोफाइल को परिभाषित करने और accesskey
  2. दुकान डेटाबेस
  3. प्रत्येक अनुरोध में इस तरह के ऐक्सेस प्रोफ़ाइल (MD5 जैसे GUID मूल्य टुकड़ों में बांटा) (प्राप्त करें/POST/आदि।) AccessId की आपूर्ति करनी चाहिए, queryHash (MD5 हैश मान क्वेरी का प्रतिनिधित्व करता है) और हस्ताक्षर (queryHash + accessKey का MD5 हैश मान)। बेशक ग्राहक को सुरक्षित जगह पर पहुंच रखने की ज़रूरत है !!!
  4. सर्वर अनुरोध accessId और हस्ताक्षर एक ही गणना एल्गोरिथ्म का उपयोग कर या अस्वीकार पहुंच देने के लिए (प्रमाणित) की जाँच करेगा
  5. आगे प्राधिकरण पहुंच प्रोफ़ाइल

उपयोग अनुरोध प्रकार के आधार पर किया जा सकता है हो जाता है नए एएसपी.नेट एमवीसी वेब एपीआई का उपयोग करके इस दृष्टिकोण के साथ सेवा किसी भी प्रकार के क्लाइंट की सेवा कर सकती है: ब्राउजर/जावास्क्रिप्ट और देशी (डेस्कटॉप या मोबाइल) इत्यादि

+3

आप एमडी 5 से कुछ मजबूत समझ सकते हैं। इस बिंदु पर इसे बहुत जल्दी क्रैक किया जा सकता है, मिनट या घंटे सोचें। आपको कुछ मजबूत, जैसे SHA256/512, या अधिमानतः कुछ computationally धीमी, bCrypt की तरह होना चाहिए। http://www.codinghorror.com/blog/2007/09/rainbow-hash-cracking.html http://www.codinghorror.com/blog/2012/04/speed-hashing.html http: // सुरक्षा। stackexchange.com/questions/211/ http://www.eweek.com/c/a/Security/SSL-Crack-Shows-You-Must-Advance-Your-Security/1/ – EBarr

+0

यह कुछ उपयोगी जानकारी @EBarr है (मैंने आपको +1 किया), लेकिन मुझे लगता है कि वह इस उदाहरण में एमडी 5 के साथ सुरक्षित होगा, इस बात पर विचार करते हुए कि वह एन्क्रिप्टिंग कर रहा है वह इंद्रधनुष तालिका के लिए बहुत बड़ा और अस्पष्ट होगा। – Grinn

+0

@ ग्रिन इंद्रधनुष सारणी 2005 इतनी हैं ;-)। निश्चित रूप से एमडी 5 यह करता है। हालांकि, एमडी 5 इन दिनों मजबूत जीपीयू पर कुछ मिनटों में मजबूर हो सकता है। उदाहरण के लिए कुछ $$ के लिए एक अमेज़ॅन ec2 जीपीयू बॉक्स। – EBarr

0

यू एक्शनफिल्टर एट्रिब्यूट का उपयोग कर सकते हैं और ऑनएक्शन एक्सेलिंग विधि को ओवरराइड कर सकते हैं। बाद में इस फ़िल्टर को global.cs में पंजीकृत करने के लिए इस फ़िल्टर को एप्लिकेशन स्टार्ट विधि

var config = GlobalConfiguration.Configuration; config.Filters.Add (नया CustomAuthAttribute());

{ नाम स्थान Customss { सार्वजनिक वर्ग CustomAuthAttribute: ActionFilterAttribute

{ 

    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     // To inforce HTTPS if desired , else comment out the code 
     if (!String.Equals(actionContext.Request.RequestUri.Scheme, "https", StringComparison.OrdinalIgnoreCase)) 
     { 
      actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest) 
      { 
       Content = new StringContent("HTTPS Required") 
      }; 
      return; 
     } 

     // get toekn from the header 

     var userToken = actionContext.Request.Headers.GetValues("UserToken"); 
     // Customer Logic to check the validity of the token. 
     // U can have some DB logic to check , custom STS behind or some loca cache used to compare the values 


    } 


} 

} }

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