2011-11-01 8 views
8

मैं एक MVC अनुप्रयोग है और मैं दिखाया गया के रूप में यह के लिए एक कस्टम roleprovider लिखा roleprovider कस्टम कंट्रोलर और क्रियाओं तक पहुंच को प्रतिबंधित करने के साथ-साथ:MVC कैसे HttpContext.Current.User.IsInRole लिए इसे हुक करने ("myrole")

[Authorize(Roles = "Administrator")] 

नियंत्रक या क्रिया के ऊपर।

HttpContext.Current.User.IsInRole("Administrator") 

इस विधि मेरी roleprovider का हिस्सा हालांकि बहुत ओवरराइड नहीं हो रही है नहीं है:

मैं भी का उपयोग कर, हालांकि ध्यान में रखते हुए कुछ बातें करने के लिए प्रतिबंधित एक्सेस चाहते हैं।

क्या कोई इस विधि के लिए इसे कैसे करना है जानता है?

उत्तर

11

यदि आपने web.config में एप्लिकेशन के लिए रोल प्रदाता को भूमिका प्रदाता के रूप में लगाया है, तो यह स्वचालित रूप से कार्य करना चाहिए; फ्रेमवर्क अनुरोध के आरंभ में एक प्रमाणित उपयोगकर्ता के लिए RolePrincipal बनाएगा जो आपके रोल प्रदाता पर GetRolesForUser विधि को कॉल करेगा, उपयोगकर्ता नाम के रूप में IIdentity से नाम पारित करेगा।

RolePrincipal के IsInRole(string role) विधि के ढांचे के कार्यान्वयन (मैं टिप्पणी जोड़ दिया है)

public bool IsInRole(string role) 
{ 
    if (_Identity == null) 
     throw new ProviderException(SR.GetString(SR.Role_Principal_not_fully_constructed)); 

    if (!_Identity.IsAuthenticated || role == null) 
     return false; 
    role = role.Trim(); 
    if (!IsRoleListCached) { 
     _Roles.Clear(); 

     // here the RoleProvider is used to get the roles for the user 
     // and are cached in a collection on the RolePrincipal so that 
     // they are only fetched once per request 
     string[] roles = Roles.Providers[_ProviderName].GetRolesForUser(Identity.Name); 
     foreach(string roleTemp in roles) 
      if (_Roles[roleTemp] == null) 
       _Roles.Add(roleTemp, String.Empty); 

     _IsRoleListCached = true; 
     _CachedListChanged = true; 
    } 
    return _Roles[role] != null; 
} 

अपने RoleProvider GetRolesForUser विधि के अंदर एक ब्रेकपाइंट सेट सुनिश्चित करना है कि इसे सही ढंग से और भी बुलाया जा रहा है कुछ इस तरह है IPrincipal (HttpContext.Current.User) का निरीक्षण करने के लिए यह सुनिश्चित करें कि यह प्रमाणित उपयोगकर्ता के लिए RolePrincipal है।

+0

मेरी भूमिका प्रदाता पर इस विषय पर

<roleManager defaultProvider="CustomUserRolesMVCRoleProvider" enabled="true" cacheRolesInCookie="true"> 

सच अच्छा ट्यूटोरियल विधि IsInRole शामिल नहीं है, हालांकि। यह RoleProvider से विरासत में है और विधि IsUserInRole है। – AnonyMouse

+3

HttpContext.Current.User पर IsInRole विधि एक प्रकार के कार्यान्वयन IPrincipal पर है। जब आपके पास रोलप्रोवाइडर पंजीकृत होता है और एक अधिकृत उपयोगकर्ता से अनुरोध आता है, तो आईप्रिनिपलर रोल प्रिंसिपल का उदाहरण होगा। आप उपर्युक्त विधि से देख सकते हैं कि रोलप्रिनिपलर पर IsInRole रोलप्रोवाइडर की GetRolesForUser विधि को कॉल करता है, ताकि वह आपको यह सुनिश्चित करने के लिए ब्रेकपॉइंट सेट करने की आवश्यकता हो जिसे सही तरीके से कहा जा सके। –

5

क्षमा करें मैं यहां पार्टी के लिए देर हो चुकी हूं;

एक ही समस्या के साथ अन्य लोगों के लाभ के लिए - Russ Cam's उत्तर उत्तर खोजने के लिए है।

मेरे मामले में, मेरी कस्टम भूमिका प्रबंधक के पास 'सक्षम = "सत्य नहीं था और cacheRolesInCookie =" true "। ऐसा लगता है कि GetRolesForUser को बुलाया जा रहा है।

कार्य web.config के लिए कोड: http://www.brianlegg.com/post/2011/05/09/Implementing-your-own-RoleProvider-and-MembershipProvider-in-MVC-3.aspx

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