2015-06-27 12 views
8

मैं बाह्य लॉगिन को लागू करने के लिए ASP.Net पहचान का उपयोग कर रहा हूं। Google के साथ उपयोगकर्ता लॉगिन के बाद मुझे Google का बाहरी एक्सेस टोकन मिलता है। मैं फिर ObtainLocalAccessToken() पर दूसरा एपीआई कॉल करता हूं जो एक नए स्थानीय के लिए बाहरी पहुंच टोकन का व्यापार करता है।पहुंच टोकन सत्यापित करें - Asp.Net पहचान

ObtainLocalAccessToken()VerifyExternalAccessToken() पर कॉल करता है जो मैन्युअल रूप से http कॉल करके और user_id को पार्स करके प्रदाता के साथ बाहरी पहुंच टोकन को सत्यापित करता है।

मैं पूरी विधि VerifyExternalAccessToken() को हटाने के लिए एएसपी.NET पहचान का लाभ कैसे उठा सकता हूं?

मुझे विश्वास है कि [HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)] है ना? मुझे लगता है कि विशेषता के साथ ObtainLocalAccessToken() endpoint सजाने और हैडर ({'Authorization' : 'Bearer xxx' }) में external_access_token भेजना चाहते हैं, और इसे मैन्युअल रूप से बाहरी पहुँच टोकन को सत्यापित करने की जरूरत के बिना User.Identity पॉप्युलेट करना चाहिए? मुझे विश्वास है कि यह उद्देश्य है, हालांकि मैं इसे काम नहीं कर सकता। मैं गूगल से एक वैध बाहरी पहुँच टोकन भेजने के लिए और यह एक 401

मैं Startup.Auth में इस लाइन btw के साथ खारिज कर दिया जाता है:

app.UseOAuthBearerTokens(new OAuthAuthorizationServerOptions 
     { 
      TokenEndpointPath = new PathString("/Token"), 
      Provider = new ApplicationOAuthProvider(), 
      AuthorizeEndpointPath = new PathString("/AccountApi/ExternalLogin"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
      AllowInsecureHttp = true 
     }); 

वैकल्पिक रूप से, इसका इस्तेमाल करने "/ टोकन" endpoint संभव है स्थानीय के लिए बाहरी पहुंच टोकन का व्यापार करने के लिए? कौन सा दृष्टिकोण सही है?

+0

मैं यहां एक जंगली अनुमान लगाऊंगा।लेकिन Google से उपयोग की जाने वाली हर सेवा https के माध्यम से होती है। यह संभव है कि आप AllowInsecureHttp = true का उपयोग नहीं कर सकते? चूंकि आपकी त्रुटि 401 है, मुझे पूरा यकीन है कि इसका मतलब है कि http पर कॉल की अनुमति नहीं है। – GELR

+1

वैसे मैं एसएसएल का उपयोग नहीं कर सकता, इसलिए मुझे http का उपयोग करके काम करने की ज़रूरत है, जैसे यह मेरे वेब एप्लिकेशन से है (लेकिन मोबाइल से नहीं)। लेकिन क्या मैं अपनी समझ में सही हूं कि [होस्ट प्रमाणीकरण (DefaultAuthenticationTypes.ExternalBearer)] बाहरी पहुंच टोकन भेजते समय सिद्धांत को पॉप्युलेट करना चाहिए? यदि हां, तो यह कैसे पता चलेगा कि एक्सेस प्रदाता किस प्रदाता से है? – parliament

+1

और 401 = अनधिकृत के अलावा। "इस अनुरोध के लिए प्राधिकरण से इनकार कर दिया गया है।" – parliament

उत्तर

5

Taiseer Joudeh

/ExternalLogin endpoint द्वारा कार्यान्वयन का अध्ययन Owin प्रमाणीकरण चुनौती बदल देता है।

AngularJSLoginControllerauthService.obtainAccessToken को फोन करेगा बाह्य रूप में प्रमाणित उपयोगकर्ता पहचान प्रदाता में नहीं पाया गया है जब:

 if (fragment.haslocalaccount == 'False') { 
      ... 
     } 

     else { 
      //Obtain access token and redirect to orders 
      var externalData = { provider: fragment.provider, 
         externalAccessToken: fragment.external_access_token }; 
      authService.obtainAccessToken(externalData).then(function (response) { 

       $location.path('/orders'); 

यह का उपयोग करता है VerifyExternalAccessTokenके खिलाफ एक रिवर्स लुकअप करने के लिए Google और फेसबुक एपीआई भालू टोकन के लिए दावा जानकारी प्राप्त करने के लिए है।

 if (provider == "Facebook") 
     { 
      var appToken = "xxxxxx"; 
      verifyTokenEndPoint = string.Format("https://graph.facebook.com/debug_token?input_token={0}&access_token={1}", accessToken, appToken); 
     } 
     else if (provider == "Google") 
     { 
      verifyTokenEndPoint = string.Format("https://www.googleapis.com/oauth2/v1/tokeninfo?access_token={0}", accessToken); 
     } 
     else 
     { 
      return null; 
     } 

तो टोकन पाया जाता है, यह [HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)] के साथ एक नया ASP.NET वाहक टोकन

 var accessTokenResponse = GenerateLocalAccessTokenResponse(user.UserName); 

     return Ok(accessTokenResponse); 

रिटर्न Owin मिडिलवेयरबाहरी वाहक टोकन का उपयोग करता है तीसरे पक्ष की कुकी तक पहुंचें और एक नया खाता पंजीकृत करें (या मौजूदा खोजें)।

Owin मिडिलवेयरबाहरी वाहक टोकन स्थानीय प्राधिकारी टोकन के बजाय स्वीकार करने के लिए कॉन्फ़िगर नहीं किया जा सकता है। बाहरी भालू टोकन केवल प्रमाणीकरण और पंजीकरण के लिए उपयोग किया जाता है।

+1

हाय डेव, ओविन मिडलवेयर में बनाया गया कोई अन्य समाधान या तरीका है या अन्यथा बाहरी प्रदाता टोकन को सत्यापित करने के लिए कहा जा सकता है? 'VerifyExternalAccessToken()' का कस्टम तर्क पहिया को फिर से आविष्कार/पुन: आविष्कार करता है क्योंकि प्रत्येक बार जब मैं एक नया बाहरी प्रदाता जोड़ना चाहता हूं तो विधि को अद्यतन करने की आवश्यकता होगी। जैसे ट्विटर। धन्यवाद! – GFoley83

+0

दरअसल, @ GFoley83, 'VerifyExternalAccessToken()' एक हैक है। और ओविन ने ओथ कुकीज़ का उपभोग करने के तरीकों में बेक किया है। लेकिन प्रमाणीकरण * टोकन * उपभोग करने के लिए कोई नहीं। ओथ बेयरर टोकन के पीछे आईडी प्राप्त करने के लिए, आप प्रदाता की दया पर हैं। –

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