2010-07-19 11 views
6

मैं एक कस्टम भूमिका प्रदाता को क्रियान्वित किया है का सम्मान नहीं है, और इस तरह मेरी web.config फ़ाइल में कॉन्फ़िगर किया गया:एएसपी नेट कस्टम RoleProvider cacheRolesInCookie = "true"

<roleManager enabled="true" defaultProvider="TDRoleProvider" cacheRolesInCookie="true"> 
    <providers> 
    <clear/> 
    <add name="TDRoleProvider" type="TDRoleProvider"/> 
    </providers> 
</roleManager> 

मैं GetRolesForUser समारोह अधिरोहित किया है मेरे कस्टम रोल प्रदाता में, और मैंने इसमें कदम रखा है, और यह ठीक काम करता है - उस उपयोगकर्ता के लिए 60 भूमिकाएं लोड करता है जिसका मैं परीक्षण कर रहा हूं। हालांकि, मैंने देखा है कि GetRolesForUser को प्रत्येक अनुरोध पर बुलाया जाता है जो User.IsInRole को कॉल करता है। मैंने लिखा है कि अन्य ऐप्स में, यह केवल एक बार कॉल करता है, फिर कुकी में परिणाम कैश करता है। किसी कारण से, कैशिंग इस ऐप के लिए काम नहीं कर रही है। कोई विचार कि ऐसा क्यों है?

उत्तर

2

http://connect.microsoft.com/VisualStudio/feedback/details/104688/rolemanager-cacherolesincookie-option-does-not-work

"जब कैश करने के लिए (या नहीं कैश) RolePrincipal में डिजाइन पुनरावृत्तियों के एक नंबर के माध्यम से चला गया, और हम अंत में द्वारा उजागर विधि के लिए केवल कैशिंग पर बसे के मुद्दे आईप्रिनियल इंटरफेस (यानी IsInRole)। "

+0

तो ऐसा करने का बेहतर तरीका क्या होगा? मैं कुकी में पकाने की भूमिका चाहता हूं। –

+0

परीक्षण-और-त्रुटि और सावधानी से चयन करना कि कौन सी विधियों का उपयोग करना है, मुझे लगता है। – Greg

+5

लिंक टूटा हुआ है। –

1

मेरे लिए भी यही सच है। यह GetRolesForUser बुला रहता है()

+0

जोआओ का जवाब देखें, यह काम करता है। – Lee

3

मुझे एक ही समस्या थी। मेरे मामले में मुद्दा यह था कि मैं Context.User जेनेरिक प्रिंसिपल को स्थापित कर रहा था और रोल प्रिंसिपल नहीं। तो बजाय:

this.Context.User = new GenericPrincipal(customIdentity, roles); 

यह मेरे लिए तय:

private static bool IsValidAuthCookie(HttpCookie authCookie) 
    { 
     return authCookie != null && !String.IsNullOrEmpty(authCookie.Value); 
    } 

अद्यतन:

  HttpCookie roleCookie = this.Context.Request.Cookies[Roles.CookieName]; 
      if (IsValidAuthCookie(roleCookie)) 
      { 
       this.Context.User = new RolePrincipal(customIdentity, roleCookie.Value); 
      } 
      else 
      { 
       this.Context.User = new RolePrincipal(customIdentity); 
       var x = this.Context.User.IsInRole("Visitor"); // do this to cache the results in the cookie 
      } 

IsValidAuthCookie विधि अशक्त और खाली के लिए चेक MVC5 .NET 4.5 पर अपग्रेड करने के बाद भूमिका प्रबंधक ने काम करना बंद कर दिया (कुकी में भूमिकाओं को सहेज नहीं रहा) इसलिए इसे खुद को सहेजना पड़ा:

 HttpCookie roleCookie = filterContext.HttpContext.Request.Cookies[Roles.CookieName]; 
     if (IsValidAuthCookie(roleCookie)) 
     { 
      filterContext.Principal = new RolePrincipal(customIdentity, roleCookie.Value); 
      RolePrincipal rp = (RolePrincipal)filterContext.Principal; 
      if (!rp.IsRoleListCached) // check if roles loaded properly (if loads old cookie from another user for example, roles won't be loaded/cached). 
      { 
       // roles not loaded. Delete and save new 
       Roles.DeleteCookie(); 
       rp.IsInRole("Visitor"); // load Roles 
       SaveRoleCookie(rp, filterContext); 
      } 

     } 
     else 
     { 
      filterContext.Principal = new RolePrincipal(customIdentity); 
      filterContext.Principal.IsInRole("Visitor"); // do this to cache the results in the cookie. 
      SaveRoleCookie(filterContext.Principal as RolePrincipal, filterContext); 
     } 

सहेजें roleCookie

private void SaveRoleCookie(RolePrincipal rp, AuthenticationContext filterContext) 
    { 
     string s = rp.ToEncryptedTicket(); 
     const int MAX_COOKIE_LENGTH = 4096; 
     if (string.IsNullOrEmpty(s) || s.Length > MAX_COOKIE_LENGTH) 
     { 
      Roles.DeleteCookie(); 
     } 
     else 
     { 
      HttpCookie cookie = new HttpCookie(Roles.CookieName, s); 
      cookie.HttpOnly = true; 
      cookie.Path = Roles.CookiePath; 
      cookie.Domain = Roles.Domain; 
      if (Roles.CreatePersistentCookie) 
       cookie.Expires = rp.ExpireDate; 
      cookie.Secure = Roles.CookieRequireSSL; 
      filterContext.HttpContext.Response.Cookies.Add(cookie); 
     } 
    } 

प्लेस AuthenticationFilter पर इस कोड और यह विश्व स्तर पर रजिस्टर। here देखें।

+0

मैं इस मुद्दे पर घंटों की खोज कर रहा हूं और यह तय है! इसे पोस्ट करने के लिए बहुत - बहुत धन्यवाद! क्या आप एक प्रश्न का उत्तर दे सकते हैं, विधि IsValidAuthCookie के लिए संदर्भ क्या है या उस विधि में उस कोड को कौन सा वर्ग लिखा गया है? –

+0

धन्यवाद इस उत्तर में बहुत मदद मिली। यह वह एकमात्र समाधान है जो एमवीसी 5 में काम नहीं कर रहा है जब आप रोल रोलोवाइडर को रोके जाते हैं। मैंने इसे अपने स्वयं के प्राधिकरण विशेषता में रखा है। – Lee

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