2014-05-13 13 views
14

की अवधि के बाद कस्टम दावा जानकारी खो देती है मैं प्रत्येक अनुरोध पर अनावश्यक डेटाबेस प्रश्नों से बचने के लिए एएसपी.NET पहचान कुकी में उपयोगकर्ता के वास्तविक नाम जैसे कस्टम दावों को संग्रहीत कर रहा हूं। अपेक्षा के अनुरूपपहचान कुकी

private static string GetClaim(string claimType) 
{ 
    var identity = (ClaimsPrincipal) Thread.CurrentPrincipal; 
    var claim = identity.Claims.SingleOrDefault(o => o.Type == claimType); 
    return claim == null ? null : claim.Value; 
} 

identity.Claims संपत्ति निम्नलिखित दावे हैं,:

var identity = await user.GenerateUserIdentityAsync(UserManager); 
identity.AddClaim(new Claim(ClaimTypes.GivenName, user.FirstName))); 
// etc. 
AuthenticationManager.SignIn(new AuthenticationProperties {IsPersistent=true}, identity); 

यह ठीक काम करता है, और मैं के साथ इन दावों को प्राप्त कर सकते हैं: कम से कम है कि मैं क्या यह मान कोड कर रही है है

http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier: ced2d16c-cb6c-4af0-ad5a-09df14dc8207 
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name: [email protected] 
http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider: ASP.NET Identity 
AspNet.Identity.SecurityStamp: 284c648c-9cc7-4321-b0ce-8a347cd5bcbf 
http://schemas.microsoft.com/ws/2008/06/identity/claims/role: Admin 
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname: My Name 

समस्या यह है कि कुछ समय बाद (आमतौर पर कई घंटे), मेरे कस्टम दावे गायब होने लगते हैं - इस उदाहरण में, givenname अब एन्युमरेट में मौजूद नहीं है आयन। उपयोगकर्ता अभी भी प्रमाणीकृत है, और सभी डिफ़ॉल्ट दावे अभी भी वहां हैं।

क्या चल रहा है, और मैं इसे कैसे ठीक कर सकता हूं? एकमात्र चीज जो मैं सोच सकता हूं वह यह है कि कुकी समाप्त हो रही है और दृश्यों के पीछे फिर से जारी की जा रही है, लेकिन मुझे नहीं पता कि क्यों (या अगर) ऐसा होगा।

+0

हाय @ जेम्स। क्या मेरे द्वारा एक सवाल पूछा जा सकता है। आपने कहा था कि आप इसे "हर अनुरोध पर अनावश्यक डेटाबेस प्रश्नों से बचने" के लिए कर रहे थे। इससे मुझे लगता है कि पहचान को प्रत्येक अनुरोध पर डेटाबेस तक पहुंचना चाहिए। क्या यह सच है? मैंने एक बहुत ही सरल परीक्षण किया और यह डेटाबेस तक पहुंचने के लिए प्रतीत नहीं हुआ ('DbContext.Database.Log' से कोई आउटपुट नहीं होने पर), लेकिन शायद इसे कैश किया गया था। प्रति HTTP अनुरोध डेटाबेस पहुंच के रूप में जानना अच्छा लगेगा बुरी खबर होगी। –

+0

@ जोन्सस्मिथ अगर मैंने उपयोगकर्ता के वास्तविक नाम को कहीं भी कैश नहीं किया है (यानी ऑथ कुकी में), तो मुझे हर बार ग्राहक टेबल से पूछताछ करना होगा कि मैं जानना चाहता हूं कि उनका नाम क्या है। – James

+0

हाय @ जेम्स। ठीक है, मुझे अब मिल गया है। मेरे पास लगभग एक ही समस्या थी लेकिन डेटाबेस में दावा के रूप में इसे जोड़कर यह कुकी में स्वचालित रूप से दिखाई दिया। मुझे लगता है कि कुकी को सभी उपयोगकर्ता की जानकारी लेनी होगी, इस तरह यह एक लुकअप की आवश्यकता के बिना आईप्रिनिस्टर को स्थापित करता है। –

उत्तर

16

हां, समस्या सबसे अधिक संभावना है कि कुकी समाप्त हो रही है। चूंकि आपने डेटाबेस में उपयोगकर्ता के दावों के लिए कस्टम दावों को नहीं जोड़ा है, इसलिए वे रीफ्रेश पर खो गए हैं क्योंकि आप कॉल करने के तरीके के अंदर दावा नहीं जोड़ रहे हैं। आप के माध्यम से दावा जोड़ने या तो कर सकते हैं:

userManager.AddClaim(user.Id, new Claim(ClaimTypes.GivenName, user.FirstName)); 

या आप (डिफ़ॉल्ट अपने user.GenerateUserIdentityAsync से) विधि जब कुकी पुनर्जीवित कर रहा है कहा जाता है कि इस के अंदर जा सकते हैं।

 app.UseCookieAuthentication(new CookieAuthenticationOptions { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      Provider = new CookieAuthenticationProvider { 
       // Enables the application to validate the security stamp when the user logs in. 
       // This is a security feature which is used when you change a password or add an external login to your account. 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
        validateInterval: TimeSpan.FromMinutes(30), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      } 
     }); 
+1

आपकी सलाह के लिए बहुत धन्यवाद। मैं डेटाबेस के दावों को जारी नहीं रखूंगा, क्योंकि तब उपयोगकर्ता का पहला नाम दो बार संग्रहीत किया जाएगा (उपयोगकर्ता और दावे टेबल में) और मुझे अद्यतित रखने के बारे में चिंता करने की आवश्यकता होगी। कृपया आप 'GenerateUserIdentityAsync' विधि पर विस्तारित कर सकते हैं? मुझे आपके द्वारा प्रदान किए गए स्निपेट को कहां शामिल करने की आवश्यकता है, और मैं 'GivenName' दावा कहां जोड़ूं? एक बार फिर धन्यवाद। – James

+3

आपके पास पहले से ही एक जेनरेट यूज़र इडेंटिटी विधि है जिसे आपके साइन इन में बुलाया जाता है। आपको उस कोड को ले जाना चाहिए जहां आप उस विधि में दावा जोड़ते हैं, और आपको अच्छा होना चाहिए –

+0

मेरे पास समान आवश्यकताएं हैं, लेकिन मेरा उपयोगकर्ता नाम (और अन्य ऐप जानकारी) वास्तव में एक अलग डेटाबेस (पहचान डीबी नहीं) में संग्रहीत है, इसलिए लॉगिन पर, जब GenerateUserIdentityAsync() विधि लागू की जाती है, तो मुझे उस डेटा को पुनर्प्राप्त करने के लिए मेरे अन्य EF dbcontext से पूछताछ करने की आवश्यकता होती है, और पहचान के लिए कस्टम दावों को जोड़ना पड़ता है, सही बात? –

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