2015-06-03 11 views
8

मैं समझने की कोशिश कर रहा हूं कि ओएथ कैसे काम करता है, लेकिन यह एक बड़े जादू शो की तरह लगता है, और मुझे यह पसंद नहीं है।OWIN के साथ OAuth कैसे MVC5 में काम करता है?

मैंने एक नया एमवीसी 5 प्रोजेक्ट बनाया है और फेसबुक प्रमाणीकरण सक्षम किया है। यह सब ठीक काम करता है, हालांकि, मैं यह समझने की कोशिश कर रहा हूं कि यह कैसे काम करता है।

यहां वह हिस्सा है जहां मैं खो गया हूं। कल्पना करें कि उपयोगकर्ता पहली बार लॉग इन करना चाहता है। इस विधि निष्पादित होने

public async Task<ActionResult> ExternalLoginCallback(string returnUrl) 
    { 
     var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); 
     if (loginInfo == null) 
     { 
      return RedirectToAction("Login"); 
     } 

     // Sign in the user with this external login provider if the user already has a login 
     var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false); 
     switch (result) 
     { 
      case SignInStatus.Success: 
       return RedirectToLocal(returnUrl); 
      case SignInStatus.LockedOut: 
       return View("Lockout"); 
      case SignInStatus.RequiresVerification: 
       return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false }); 
      case SignInStatus.Failure: 
      default: 
       // If the user does not have an account, then prompt the user to create an account 
       ViewBag.ReturnUrl = returnUrl; 
       ViewBag.LoginProvider = loginInfo.Login.LoginProvider; 
       return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email }); 
     } 
    } 

इस कोड को अमेरिकन प्लान प्रवेश पृष्ठ पता चलता है और अमेरिकन प्लान साख का ख्याल रखना होगा। यह सब ठीक काम करता है। लेकिन फिर, यह लाइन निष्पादित की गई है: var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false);। मैं loginInfo में देख सकता हूं कि एक नाम सेट है, लेकिन result variabel Failure पर सेट है। ऐसा क्यों है? उपयोगकर्ता को अभी एफबी द्वारा प्रमाणीकृत किया गया है, तो मूल्य false क्यों है?

लेकिन फिर, मेरी भावना के लिए यह वीडर हो जाता है। जब मैं नमूना आवेदन जारी रखना जारी रखता हूं, तो यह मुझे एक ई-मेल पता दर्ज करने के लिए कहता है। मैं एक ई-मेल पता और वॉयला दर्ज करता हूं, मैं लॉग इन हूं। चूंकि मैं इस पूरी लॉगिन चीज़ की खोज कर रहा हूं, इसलिए मैं लॉग ऑफ करता हूं और मैं फिर से लॉग इन करना चाहता हूं। इसलिए, मैं लॉग इन करता हूं और तुरंत एफबी का उपयोग करके फिर से लॉग इन करता हूं। और यहां वह जगह है जहां मैंने दीवार के खिलाफ अपना सिर धक्का दिया। जब कोड इस लाइन को फिर से हिट करता है: var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false); परिणाम true पर सेट है !!

क्या कोई मुझे बता सकता है कि यहां क्या हो रहा है ??

उत्तर

5

जब आप बाहरी लॉगिन का उपयोग करते हैं तो SignInManager बाहरी पार्टी (इस मामले में फेसबुक) के साथ उपयोगकर्ता प्रमाण-पत्र मान्य करता है। यदि बाहरी पार्टी ने प्रमाण-पत्र सफलतापूर्वक सत्यापित किए हैं तो साइनइन प्रबंधक जांचता है कि कोई उपयोगकर्ता रिकॉर्ड मौजूद है या नहीं। चूंकि यह पहला लॉगिन है, इसलिए कोई भी उपलब्ध उपयोगकर्ता रिकॉर्ड नहीं है। इस भाग का ख्याल रखता है:

case SignInStatus.Failure: 
     default: 
      // If the user does not have an account, then prompt the user to create an account 
      ViewBag.ReturnUrl = returnUrl; 
      ViewBag.LoginProvider = loginInfo.Login.LoginProvider; 
      return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email }); 

यह आपको एक और ईमेल पता उपयोग करने की अनुमति देता है। एक ही ईमेल पते का उपयोग करना आम तौर पर आम है!

कुछ नमूने: http://www.asp.net/mvc/overview/security/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2-and-openid-sign-on

+1

धन्यवाद। मुझे वह हिस्सा कहां मिल सकता है जहां साइनइन प्रबंधक जांचता है कि कोई रिकॉर्ड मौजूद है या नहीं? यह एक तरह का जादुई लगता है। – Martijn

+2

इसे इस वेबसाइट पर मिला: https://www.symbolsource.org/MyGet/Metadata/aspnetwebstacknightly/Project/Microsoft.AspNet.Identity.Owin/2.2.0-alpha1-140725/Release/Default/Microsoft.AspNet.Identity .Owin/Microsoft.AspNet.Identity.Owin/SignInManager.cs? ImageName = Microsoft.AspNet.Identity.Owin। –

+1

हां, स्रोत को देखने के बाद, मुझे विश्वास है कि साइनइनस्टैटस। विफलता का नाम केवल भ्रमित करने के लिए रखा गया है। SignInManager.ExternalSignInAsync() को कॉल करने में, मेरा मानना ​​है कि इसे केवल उपयोगकर्ता के लिए वापस नहीं किया जा सकता है। इसे अन्य कॉलों में अन्य प्रकार की विफलताओं के लिए वापस किया जा सकता है। – mheyman

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