2010-01-21 10 views
5

में उपयोगकर्ता की भूमिका मिल वहाँ एक रास्ता मैं नीचे दिए गए आदेशों का उपयोग कर एक स्ट्रिंग चर में भूमिका मिल सकती है ....एक स्ट्रिंग चर

System.Security.Principal.WindowsIdentity wi = System.Security.Principal.WindowsIdentity.GetCurrent(); 
    System.Security.Principal.WindowsPrincipal wp = new System.Security.Principal.WindowsPrincipal(wi); 

मैं

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,       // version 
                UserName.Text,   // user name 
                DateTime.Now,    // creation 
                DateTime.Now.AddMinutes(60),// Expiration 
                false,      // Persistent 
                role);   // User data 

के लिए इस की जरूरत है स्ट्रिंग भूमिका = wp.IsInRole() के रूप में;
लेकिन यह सही

कुछ इस के समान नहीं है ...

उत्तर

1
तो जैसा

?

public static string FormsAuthUserData 
{ 
    get 
    { 
     IPrincipal principal = Thread.CurrentPrincipal; 
     if (principal == null) return null; 
     FormsIdentity identity = principal.Identity as FormsIdentity; 
     if (identity == null) return null; 
     FormsAuthenticationTicket ticket = identity.Ticket; 
     return ticket == null ? null : ticket.UserData; 
    } 
} 
6

आप समूहों/भूमिकाओं की एक सूची है कि एक उपयोगकर्ता WindowsIdentity.Groups संपत्ति से का हिस्सा है प्राप्त कर सकते हैं। WindowsIdentity.Groups संग्रह में केवल समूह/भूमिकाओं के समूह के एसआईडी (पहचान पहचान का संग्रह) शामिल है, लेकिन समूह/भूमिकाओं के वास्तविक नाम नहीं हैं। मैं आपको दिखाऊंगा कि उपयोगकर्ता के सभी समूहों/भूमिकाओं के वास्तविक नाम कैसे प्राप्त करें।

सबसे पहले, WindowsIdentity ऑब्जेक्ट प्राप्त करें।

WindowsIdentity identity = WindowsIdentity.GetCurrent(); 

दूसरा, NTAccount के लिए सिड के (IdentityReference) अनुवाद करने के लिए LINQ का उपयोग करें।

var groups = from sid in identity.Groups select sid.Translate(typeof(NTAccount)).Value; 

फिर आप समूहों के माध्यम से पाश और उन्हें एक स्ट्रिंग सरणी कि FormsAuthenticationTicket में इस्तेमाल किया जा सकता में संग्रहीत करते हैं। यह आपको बिल्टिन (स्थानीय कंप्यूटर) समूह/भूमिकाएं और उपयोगकर्ता समूह में भी भूमिकाएं प्राप्त करेगा।

2

आप सेब और संतरे मिश्रण कर रहे हैं। क्या आप विंडोज या फॉर्म प्रमाणीकरण का उपयोग कर रहे हैं?

किसी भी मामले में, यदि आप लागू किया गया है, तो आप रोलप्रोवाइडर से उपयोगकर्ता की भूमिका प्राप्त कर सकते हैं।

धागे के वर्तमान प्रिंसिपल की जांच केवल एक जांच विधि का खुलासा करती है, जैसा कि आप जानते हैं, IsInRole, जबकि भूमिका प्रदाता उपयोगकर्ता की भूमिकाओं की एक स्ट्रिंग सरणी वापस कर देगा।

लेकिन मुझे यह पूछना है कि आप टिकट में एक भूमिका क्यों पैक कर रहे हैं? इसके लिए एकमात्र वैध उपयोग केस मैं देख सकता हूं कि आप बाहरी लेख/भूमिका सिलो को समेकित कर रहे हैं।

यदि आप अपने परिदृश्य और आवश्यकताओं को थोड़ा और पूरी तरह से समझाते हैं तो मुझे यकीन है कि हम आपकी समस्या का एक विशिष्ट समाधान पा सकते हैं।

0

हां, प्रपत्र प्रमाणीकरण विंडोज पहचान के साथ संघर्ष करना प्रतीत होता है, लेकिन मैंने कुछ कोड लिखा है जो मुझे विश्वास है कि आप जो करेंगे उससे करेंगे।

सबसे पहले, अपनी परियोजना में System.DirectoryServices का संदर्भ जोड़ें।

आपको पहले PrincipalContext ऑब्जेक्ट को प्रारंभ करने की आवश्यकता है।

imports System.DirectoryServices

Dim userImLookingFor as AccountManagement.UserPrincipal(ctx)
Dim tempUser As New AccountManagement.UserPrincipal(ctx)
tempUser.SamAccountName = p_samAccountName
Dim searcher As New AccountManagement.PrincipalSearcher(tempUser)
If searcher.FindAll().Count = 1 Then
userImLookingFor = searcher.FindAll()(0)

जब इस कोड को चलाता है, userImLookingFor उपयोगकर्ता p_samAccountName द्वारा निर्दिष्ट होता है। इसके बाद, आप समूहों की एक सूची प्राप्त करना चाहते हैं।

Dim tempGp As New AccountManagement.GroupPrincipal(userImLookingFor.Context)
Dim searcher As New AccountManagement.PrincipalSearcher(tempGp)
Dim searchResult As AccountManagement.PrincipalSearchResult(Of AccountManagement.Principal)
searchResult = searcher.FindAll()

अंत में, आप searchResult संग्रह का उल्लेख कर सकते। समूह के नाम प्राप्त करने के लिए, इंडेक्स के माध्यम से गणना करें और या तो "उपयोगकर्ता प्रिंसिपल नेम" या "एसएएम खाता नाम" पुनर्प्राप्त करें।

यूप, प्रपत्र प्रमाणीकरण सक्रिय निर्देशिका के साथ अच्छी तरह से नहीं खेलता है, लेकिन अगर यह मदद करता है तो मुझे बताएं। मैं पिछले जवाब में दृष्टिकोण से परिचित नहीं हूं; ये दो अलग-अलग उत्तर आपको ऑब्जेक्ट दे सकते हैं जो आपको विभिन्न कार्यक्षमताओं तक पहुंच प्रदान करते हैं।

0

सिस्टम में सभी भूमिकाओं का संग्रह प्राप्त करने के लिए आप अपने उपयोगकर्ता वर्ग के लिए एक विस्तार विधि कर सकते हैं (अपनी भूमिका प्रदाता से पूछना) isInRole foreach भूमिका पूछने और उपयोगकर्ता भूमिकाओं को एकत्र करने के लिए एक कण (या linq का उपयोग करें) उपयोग करने के लिए तैयार संपत्ति में।

यह किसी भी प्रकार के रोल प्रदाता के लिए सामान्य तरीका हो सकता है।

4

हो रही भूमिकाओं के लिए: http://msdn.microsoft.com/en-us/library/system.web.security.roles.getrolesforuser.aspx

उपयोग Roles.GetRolesForUser() या Roles.GetRolesForUser(Page.User.Identity.Name) भूमिकाओं वर्तमान उपयोगकर्ता है की एक सरणी प्राप्त करने के लिए। आप निर्दिष्ट कर सकते हैं कि आप किस उपयोगकर्ता को Roles.GetRolesForUser("Specific UserName")

के लिए भूमिकाएं प्राप्त करना चाहते हैं, तो उपयोगकर्ता की भूमिकाओं की एक स्ट्रिंग प्राप्त करने के लिए आप String.Join(", ",Roles.GetRolesForUser()) का उपयोग कर सकते हैं।

String.Joinhttp://msdn.microsoft.com/en-us/library/57a79xd0.aspx

आशा इस मदद करता है।

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