2014-10-02 7 views
44

मैं ओविन का उपयोग Google oAuth के माध्यम से अधिकृत करने के लिए करता हूं। यहाँ कैसे मेरी कुकीज़ कॉन्फ़िगर किया गया है है:UseCookie प्रमाणीकरण बनाम UseExternalSignInCookie

// Enable the application to use a cookie to store information for the signed in user 
app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
    LoginPath = new PathString("/Authentication/Login") 
}); 
// Use a cookie to temporarily store information about a user logging in with a third party login provider 
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

तो दोनों UseCookieAuthentication और UseExternalSignInCookie उपयोग कर रहा हूँ और यह बेमानी लगती है। इन दो प्रमाणीकरण प्रकारों में से कौन सा IAuthenticationManager विधियों (साइनइन, सिंगॉट, आदि) के लिए निर्दिष्ट करना चाहिए? या मुझे उनमें से केवल एक रखना चाहिए?

अद्यतन।

private async Task SignInAsync(ApplicationUser user, bool isPersistent) 
{ 
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); 
    var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); 
    AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity); 
} 

तो ExternalCookie से signsout, लेकिन ApplicationCookie में संकेत: क्या मुझे सबसे ज्यादा भ्रमित साइन इन करें विधि है।

उत्तर

74

यदि आप Google को काम करने के लिए साइन इन करना चाहते हैं, तो आपको उन सभी की आवश्यकता है। यह इस तरह काम करता है। ओविन पाइपलाइन में, आपके पास तीन मिडलवेयर घटक हैं: (1) कुकी प्रमाणीकरण मिडलवेयर सक्रिय मोड में चल रहा है, (2) कुकी प्रमाणीकरण मिडलवेयर का एक और उदाहरण लेकिन निष्क्रिय मोड में चल रहा है, और (3) Google प्रमाणीकरण मिडलवेयर। ऐसा ही होगा।

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
    ... 
}); // Active 

app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); // Passive 

app.UseGoogleAuthentication(...); 

जब कोई 401 होता है, तो आपका उपयोगकर्ता Google पर रीडायरेक्ट हो जाता है। वहां, आपका उपयोगकर्ता लॉग इन करता है और Google प्रमाण-पत्र को मान्य करता है। Google फिर उपयोगकर्ता को आपके ऐप पर रीडायरेक्ट करता है। इस बिंदु पर, Google प्रमाणीकरण मिडलवेयर लॉगिन जानकारी प्राप्त करता है, एक अनुदान (बाहरी कुकी पढ़ें) और ओविन पाइपलाइन को शॉर्ट सर्किट लागू करता है और बाहरी कॉलबैक यूआरएल पर रीडायरेक्ट करता है, जो AccountController की क्रिया विधि से मेल खाता है। इसलिए, इस बिंदु पर जब रीडायरेक्ट के परिणामस्वरूप अनुरोध आपके ऐप पर आता है, तो आपको उपयोगकर्ता नाम और ईमेल दावों के साथ बाहरी कुकी मिलती है।

इस कुकी को पढ़ने और Google से डेटा (उपयोगकर्ता नाम, आदि) को पुनर्प्राप्त करने के लिए, आप निष्क्रिय मोड में चल रहे कुकी प्रमाणीकरण मिडलवेयर का उपयोग करते हैं। चूंकि यह मिडलवेयर निष्क्रिय मोड में चलता है, इसलिए इसे कुकी पढ़ने के लिए कहा जाना चाहिए। ऐसा होता है जब AuthenticationManager.GetExternalLoginInfoAsync() पर कॉल ExternalLoginCallback क्रिया विधि में किया जाता है। उस समय, बाहरी कुकी से पहचान स्थापित की गई है और इस पहचान में Google से केवल नाम और ईमेल दावे शामिल हैं।

आमतौर पर, इस बिंदु पर आपको अपने एप्लिकेशन डेटा स्टोर से उपयोगकर्ता विशिष्ट जानकारी पुनर्प्राप्त करने और पहचान के लिए और दावों को जोड़ने की आवश्यकता होगी। इसलिए, आप बाहरी कुकी मिडलवेयर पर Signout पर कॉल करते हैं, जो यह भी सुनिश्चित करेगा कि बाहरी कुकी को इसे समाप्त होने से पहले वापस नहीं भेजा जाएगा। इसलिए, उस समय उपलब्ध पहचान जानकारी का उपयोग करके, UserManager.FindAsync को ExternalLoginCallback एक्शन विधि में बुलाया जाता है, जो उपयोगकर्ता को सभी एप्लिकेशन विशिष्ट दावों के साथ वापस कर देना चाहिए। उस नई पहचान का उपयोग करके, आप सक्रिय मोड में चल रहे कुकी प्रमाणीकरण मिडलवेयर पर SignIn पर कॉल करें। यह सुनिश्चित करता है कि एक नई कुकी बनाई गई है। बाहरी कुकी की तुलना में, इस नई कुकी में सभी एप्लिकेशन विशिष्ट दावे शामिल हैं।इसके बाद, आपको यह कुकी वापस मिलती है और सक्रिय मोड में चल रहे कुकी प्रमाणीकरण मिडलवेयर सक्रिय रूप से कुकी पढ़ता है और सभी एप्लिकेशन विशिष्ट दावों की पूरी सूची के साथ पहचान स्थापित करता है।

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

अद्यतन: मैंने दो कुकी मिडलवेयर उदाहरणों का उपयोग किए बिना कैसे दूर हो सकते हैं यह बताने के लिए एक ब्लॉग पोस्ट बनाया है। http://lbadri.wordpress.com/2014/10/14/barebones-asp-net-mvc-google-signin-through-owin-middleware/

+2

UserManager.FindAsync बिट्स अब पहचान 2.2.0 (जो ओएसएस नहीं है) के लिए साइनइनमैनगर में टकरा गया है, लेकिन मुझे यकीन है कि यह अभी भी हुड के तहत किया जा रहा है। अनुकूलन के कारण प्रतिबिंबक बहुत मदद नहीं करते हैं। तो अगर कोई उस बिट के साथ पालन करने की कोशिश कर रहा है और इसे नमूना कोड में नहीं ढूंढ रहा है, तो यही कारण है कि। इस तरह यह 1.0 और संभवतः 2.0 में किया गया था लेकिन 2.2 में दूर किया गया था और संभवतः vNext में थोड़ा अलग है। मैं सराहना करता हूं कि यह एक पहचान पद नहीं है लेकिन संभावना है कि बहुत से लोग उस ढांचे से नमूना कोड देख रहे हैं। – rism

+1

क्या हो सकता है जब हम AuthenticationManager.GetExternalLoginInfoAsync() को कॉल करते हैं, यह पहली बार loginInfo देता है, लेकिन अगर हम फिर से लॉगिन करने के लिए यह शून्य हो जाता है। ऐप पूल रीसायकल करने के बाद यह फिर से loginInfo लौटाता है। @Badri – fcartu

+0

कोई कारण है कि मैं निष्क्रिय निष्क्रियवेयर का उपयोग क्यों नहीं कर सकता? यदि मुझे केवल एक चीज की आवश्यकता है तो उपयोगकर्ता पहचान (जैसे फेसबुक: 133454545454)। – LOST

5

"प्रस्थान करें (DefaultAuthenticationTypes.ExternalCookie)" को "सफाई, बाहरी कुकी" के रूप में प्रति हाओ कुंग के जवाब https://stackoverflow.com/a/20575643/2710179

वहाँ Microsoft.aspnet.identity.samples परियोजना में एक अच्छा कार्यान्वयन आप डाउनलोड कर सकते हैं जो है नजेट से इस कार्यान्वयन में वे का उपयोग करें: -

var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 

"ExternalCookie" "डिफ़ॉल्ट ExternalSignInAuthenticationType के लिए इस्तेमाल किया मूल्य के लिए कॉन्फ़िगर" मुझे विश्वास है इसका मतलब यह है कि यह एक बाहरी दृष्टि के खिलाफ उपयोगकर्ता सत्यापित करने के लिए अस्थायी कुकी उपयोग के रूप में इस्तेमाल किया जाता है

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