2017-05-07 7 views
13

सेररल दिनों के लिए अब मैं अपने एएसपीनेट कोर वेब एपीआई प्रोजेक्ट के भीतर काम करने के लिए Google और फेसबुक के साथ ओथ प्रमाणीकरण प्राप्त करने का प्रयास कर रहा हूं।एएसपीनेट कोर वेब एपीआई: प्रमाणीकरण के लिए फेसबुक/Google ओएथ एक्सेस टोकन का उपयोग

मेरे वर्तमान स्थिति है:

  • मैं एक ASP.net कोर वेब एपीआई परियोजना है, जिसमें उन की जरूरत है प्रमाणीकृत करने
  • मैं जो अपने वेब का उपयोग करना चाहिए एक कोणीय 2 वेब एप्लिकेशन है (प्रमाणीकरण के साथ)
  • एपीआई मैं एक Android एप्लिकेशन है, जो अपने वेब एपीआई (प्रमाणीकरण के साथ) का उपयोग करना चाहिए

है मेरा लक्ष्य है:

  • बाद में प्रवेश के लिए OAuth प्रदाताओं के रूप में गूगल/फेसबुक का उपयोग करना: स्वयं उपयोगकर्ता खाता जोड़ने में (शायद IdentityServer4 के साथ)
  • (IdentityServer4 की तरह एक विशेष लॉगिन वेबसाइट पर रीडायरेक्ट करने की कोई जरूरत नहीं उपाय)। ऐप में बस फेसबुक/गूगल बटन दबाएं, एक्सेस की अनुमति दें, किया!

मेरे एंड्रॉइड और कोणीय ऐप में मैं Google/facebook से एक्सेस टोकन पुनर्प्राप्त करने में सक्षम हूं। अब, मैं अपने वेब एपीआई पर उपयोगकर्ता को प्रमाणीकृत करने के लिए ओएथ अंतर्निहित प्रवाह का उपयोग करना चाहता हूं, दिए गए एक्सेस टोकन (टोकरे को टोकरे के रूप में हेडर में डालकर)

मेरी समस्या है: क्या कोई भी शैली है यह आसानी से करने के लिए? मैं इसके लिए फेसबुक/गूगल एसडीके का उपयोग नहीं करना चाहता हूं। IdentityServer4 का उपयोग कर

  • : इस के साथ मैं/फेसबुक के साथ प्रवेश करने के लिए अपने WebAPI पर गूगल कर रहा हूँ, लेकिन IdentityServer4 प्रवेश पृष्ठ पर एक पुनर्निर्देशन के जरूरत नहीं है

    मैं निम्नलिखित की कोशिश की है। क्या मेरे ऐप में Google/fb-Button को मारने और पहचानने के लिए में लॉग इन करने का कोई संभावित तरीका है सर्वर सर्वर लॉगिन पृष्ठ के पुनर्निर्देशन के बिना?

  • google/facebook प्रमाणीकरण मिडलवेयर (https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/) का उपयोग करके: लेकिन वे मेरे भेजे गए भालू टोकन को मान्य नहीं कर रहे हैं (उचित सत्यापन प्राप्त करने के अनगिनत तरीकों की कोशिश की है)। क्या वेब एपीआई के भीतर भी इसका उपयोग करना संभव है?
  • Microsoft.AspNetCore.Authentication.JwtBearer-मिडिलवेयर उपयोग करने के लिए कोशिश कर रहा है और अपने आप से गूगल/फेसबुक के लिए आवश्यक विकल्प में डाल, लेकिन यह भी मान्य (अच्छी तरह से अनगिनत प्रयास)

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

कोई सुझाव या समाधान? मैं क्या खो रहा हूँ?

+1

तृतीय पक्ष प्रमाणीकरण के लिए, मेरा मानना ​​है कि जब पृष्ठ आपको वापस एप्लिकेशन (उपयोगकर्ता प्रमाणीकृत) पर रीडायरेक्ट किया जाता है, तो HTTP अनुरोध में प्रमाणीकरण डेटा होना चाहिए। आप इसे रोकने के लिए एक वैश्विक फ़िल्टर लिख सकते हैं। यहां कुछ विवरण देखें: https://andrewlock.net/an-introduction-to-oauth-2-using-facebook-in-asp-net-core/ – wannadream

+0

क्या आपने कभी इसे हल किया था? – Marcus

+1

मुझे एक समाधान मिला (कुछ हफ्ते पहले, यहां अपडेट करना भूल गया था): पहचान सर्वर 4 के ऑथ एंडपॉइंट पर, पहचानकर्ता सर्वर के लॉगिन पृष्ठ के बिना, चयनित पहचान प्रदाता की वेबसाइट पर तत्काल रीडायरेक्ट करने के लिए कोई विशेष पैरामीटर का उपयोग कर सकता है । जैसा कि यहां बताया गया है http://docs.identityserver.io/en/release/endpoints/authorize.html idp: acr_values ​​के भीतर name_of_idp पैरामीटर सीधे पहचान प्रदाता को रीडायरेक्ट करता है, जो मैं चाहता था। – Rul3r

उत्तर

10

यदि मैं सही ढंग से अंडरटैंड करता हूं, तो आपके पास पहले से ही आपके ऐप के माध्यम से फेसबुक एसडीके से आपका फेसबुक उपयोगकर्ता टोकन है।
आप की तरह मुझे यह नहीं पता था कि एएसपी.NET कोर लाइब्रेरी/पैकेज के साथ इसे कैसे किया जाए। तो मैं मूल बातें वापस चला गया।
मैं सिर्फ फेसबुक टोकन के साथ अपने एपीआई का एक एंडपॉइंट कॉल करता हूं, इसे फेसबुक ग्राफ एपीआई के खिलाफ जांचता हूं और यदि ठीक है तो मैं उपयोगकर्ता को पंजीकृत करता हूं (यदि आवश्यक हो) और मेरा जेडब्ल्यूटी टोकन वापस लौटाएं जैसे कि उपयोगकर्ता शास्त्रीय उपयोगकर्ता नाम/पासवर्ड से लॉग इन करता है पथ।

[HttpPost] 
[AllowAnonymous] 
[Route("api/authentication/FacebookLogin")] 
public async Task<IActionResult> FacebookLogin([FromBody] FacebookToken facebookToken) 
{ 
    //check token 
    var httpClient = new HttpClient { BaseAddress = new Uri("https://graph.facebook.com/v2.9/") }; 
    var response = await httpClient.GetAsync($"me?access_token={facebookToken.Token}&fields=id,name,email,first_name,last_name,age_range,birthday,gender,locale,picture"); 
    if (!response.IsSuccessStatusCode) return BadRequest(); 
    var result = await response.Content.ReadAsStringAsync(); 
    var facebookAccount = JsonConvert.DeserializeObject<FacebookAccount>(result); 

    //register if required 
    var facebookUser = _context.FacebookUsers.SingleOrDefault(x => x.Id == facebookAccount.Id); 
    if (facebookUser == null) 
    { 
     var user = new ApplicationUser {UserName = facebookAccount.Name, Email = facebookAccount.Email}; 
     var result2 = await _userManager.CreateAsync(user); 
     if (!result2.Succeeded) return BadRequest(); 
     facebookUser = new FacebookUser {Id = facebookAccount.Id, UserId = user.Id}; 
     _context.FacebookUsers.Add(facebookUser); 
     _context.SaveChanges(); 
    } 

    //send bearer token 
    return Ok(GetToken(facebookUser.UserId)); 
} 
संबंधित मुद्दे