7

के लिए मान्य है मेरे पास ASP.NET MVC 5 उपयोगकर्ता प्रमाणीकरण के लिए ASP.NET Identity 2.1.0 का उपयोग कर एप्लिकेशन है।
सबकुछ अतीत में ठीक काम करता था, लेकिन अब मुझे पता चला है कि लगातार उपयोगकर्ता सत्र अब काम नहीं करते हैं। मैं बता सकता हूँ नहीं क्या परिवर्तन इस तोड़ दिया है, लेकिन यह काम किया जब मैं पहचान कार्यान्वित (SimpleMembership से आवेदन परिवर्तित) और यह मेरा तर्क है मैं इस समय है:IsPersistent काम नहीं कर रहा है - कुकी केवल वर्तमान सत्र

var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, 
            model.RememberMe, shouldLockout: true); 

SignInManager है मेरी ApplicationSignInManager पर SignInManager<ApplicationUser, int> और model.RememberMe आधारित true है।

और मेरे सेटअप:

app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); 

app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
     LoginPath = new PathString("/Account/Login"), 
     Provider = new CookieAuthenticationProvider 
      { 
       OnValidateIdentity = ApplicationCookieIdentityValidator.OnValidateIdentity(
        validateInterval: TimeSpan.FromMinutes(0), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      } 
    }); 
app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5)); 
app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie); 
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

सब कुछ ठीक काम करता है, उपयोगकर्ता सत्र बने छोड़कर। मैंने अपने सर्वर द्वारा लौटाई गई कुकीज़ की जांच की और .AspNet.ApplicationCookie भविष्य में कुछ तारीखों के बजाय हमेशा "मौजूदा सत्र के लिए मान्य" के रूप में लौटा दिया गया है। तो जब मैं ब्राउज़र को बंद और दोबारा खोलता हूं तो मुझे फिर से लॉग इन करने की आवश्यकता होती है ...

क्या किसी को पता है कि यह क्यों काम नहीं कर रहा है (अब)?

पुनश्च: मैं अपने ApplicationSignInManager में SignInAsync ओवरराइड है क्योंकि मैं कुछ कस्टम तर्क वहाँ करते हैं, लेकिन मैं भी डीबगर के साथ और निम्नलिखित कॉल के लिए जाँच:

await base.SignInAsync(user, isPersistent, rememberBrowser); 

isPersistent, true है, इसलिए यह बनाना चाहिए एक सतत कुकी।

+0

मुझे संदेह है कि 'वैधता इंटरवल: टाइमस्पैन। फ्रॉममिन्यूट्स (0)' इसका कारण बन सकता है। क्योंकि हर अनुरोध पर यह कुकी को पुन: उत्पन्न करता है और एक नया सेट करता है। 0 से अधिक कुछ के लिए 'validateInterval' सेट करने का प्रयास करें और देखें कि क्या यह काम करता है। – trailmax

+0

@trailmax: धन्यवाद, वह था।क्या वी 2.1 के साथ यह परिवर्तन था? क्योंकि यह निश्चित रूप से शुरुआत में (वी 2.0 के साथ) काम करता था। किसी भी तरह: इसे एक उत्तर के रूप में पोस्ट करें और मैं इसे स्वीकार करूंगा। अब मुझे इसके बारे में पता लगाने की जरूरत है, क्योंकि मुझे हर अनुरोध पर (एसएसओ की वजह से) सत्यापन की आवश्यकता है। – ChrFin

उत्तर

6

This is a known bug in Identity और this answer पर देखकर यह बहुत नया नहीं है।

जब प्रत्येक अनुरोध पर कुकी को पुन: उत्पन्न किया जाता है, तो "IsPersisted" ध्वज सेट नहीं होता है, जब भी इसे मूल कुकी में सेट किया गया था।

इसके आसपास काम करने के लिए, आपको कुकी सत्यापनकर्ता का अपना संस्करण लागू करना होगा जो ध्वज को सेट करना चाहिए।

मुझे लगता है कि मुझे आपके लिए समाधान मिला है, लेकिन मैंने इसे संकलित या परीक्षण नहीं किया है - केवल एक सामान्य दिशा है जहां आपको जाना है। यह gist for full code देखें।
यह डिकंपेलर से लिया गया एक SecurityStampValidator कोड है। मेरे पास added lines 91-96 है। असल में मैं पिछले कुकी से "IsPersistent" ध्वज लेता हूं और इसे बनाए जाने पर इसे नई कुकी में जोड़ता हूं। यह गैर संशोधित संस्करण में नहीं किया गया था।

और फिर अपने Auth.Config में आप करते हैं:

Provider = new CookieAuthenticationProvider 
      { 
       OnValidateIdentity = MySecurityStampValidator.OnValidateIdentity(
        validateInterval: TimeSpan.FromMinutes(0), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      } 

हालांकि सावधान रहें, नया संस्करण बाहर है जब, देखें कि क्या यह तय किया गया था, तो आप गंदा ठीक निकाल सकते हैं। यह समस्या reported to be fixed है, लेकिन v2.1 समाप्त होने के तुरंत बाद।

+1

बहुत बहुत धन्यवाद। जैसा कि मेरे पास पहले से ही मेरा स्वयं का वैध है (मेरे कोड में 'एप्लिकेशनक्यूकी इडेंटिटी वैलिडेटर' देखें) मुझे बस वहां अपने बदलाव जोड़ने की ज़रूरत है -> काम करना! – ChrFin

+0

@ChrFin हां, मैंने देखा कि नाम मानक से अलग है। खुशी है कि यह मदद करता है! – trailmax

+0

अच्छा कोड! ऐसा लगता है कि 'माइक्रोसॉफ्ट.ऑविन। सुरक्षा का उपयोग करना' गायब है, 'प्रमाणीकरणप्रॉपर्टीज' प्रकार तक पहुंचने के लिए – Matthew

1

AspNet.Identity.Core और AspNet.Identity.Owin से 2.2.1 दोनों को अद्यतन करना इस समस्या को हल करना चाहिए।

+1

इसे अद्यतन करने के बाद भी एक ही समस्या है और पहचान कोर के लिए asp.mvc के लिए भी डिफ़ॉल्ट टेम्पलेट एक ही समस्या है। –

+0

हाँ, पहचान कोर के साथ एक ही समस्या ... –

+0

https://stackoverflow.com/questions/31946582/how-ispersistent-works-in-owin-cookie-authentication/46659752#46659752 –

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