есть ли способ, которым я могу получить роль в строковой переменной с помощью ниже команд....
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 ();
но это не правильно
что-то подобное этому...
Вы можете получить список групп / ролей, что пользователь является частью свойства Windowsidey.groups. Коллекция Windowsidey.groups содержит только SID (коллекция идентификационных элементов) групп / ролей, в которой пользователь находится, но не фактические имена групп / ролей. Я покажу вам, как получить фактические имена всех групп / ролей, в котором пользователь.
Во-первых, получите объект WindowsIndieT.
WindowsIdentity identity = WindowsIdentity.GetCurrent();
Во-вторых, используйте LINQ для перевода SID (IdentiveReference) в NTACCount's.
var groups = from sid in identity.Groups select sid.Translate(typeof(NTAccount)).Value;
Затем вы можете включить групп и хранить их в строковом массиве, который можно использовать в формате FormAsauthenticateChet. Это заставит вас как встроенные (локальные компьютерные) группы / роли, а также доменные группы / роли, в которых используется пользователь.
Мне нравится?
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;
}
}
Кажется, вы смешиваете яблоки и апельсины. Используете ли вы аутентификацию Windows или Forms?
В любом случае вы можете получить роли пользователя из RoleProvider, если он реализован.
Проверка текущего принципала потока предоставляет только метод проверки, как вы знаете, IsInRole, тогда как поставщик ролей возвращает строковый массив ролей, к которым принадлежит пользователь.
Но я должен спросить, почему вы упаковываете роль (роли) в билет? Единственный допустимый вариант использования, который я вижу для этого, - это объединение внешних разрозненных аутентификаций / ролей.
Если вы более подробно объясните свой сценарий и требования, я уверен, что мы сможем найти конкретное решение вашей проблемы.
Да, проверка подлинности с помощью форм конфликтует с идентификаторами Windows , но я написал код, который, как мне кажется, сделает то, о чем вы просите.
Прежде всего, добавьте ссылку на System.DirectoryServices
в свой проект.
Сначала необходимо инициализировать объект PrincipalContext
.
импортирует System.DirectoryServices
Dim userImLookingFor as AccountManagement.UserPrincipal (ctx)
Dim tempUser As New AccountManagement.UserPrincipal (ctx)
tempUser.SamAccountName = p_samAccountNamecher Ascher
Dim tempUser As New AccountManagement.UserPrincipal (ctx)
tempUser.SamAccountName = p_samAccountNamecher Ascher (tempUser)
Если searchcher.FindAll (). Count = 1 Тогда
userImLookingFor = searchcher.FindAll () (0)
При запуске этого кода userImLookingFor
содержит пользователя, указанного p_samAccountName. Затем вы хотите получить список групп.
Dim tempGp As New AccountManagement.GroupPrincipal (userImLookingFor.Context)
Dim searchcher As New AccountManagement.PrincipalSearcher (tempGp)
Dim searchResult As AccountManagement.PrincipalSearchResult (Of AccountManagement.Principal)
searchResult = searchcher.FindAll ()
Наконец, вы можете обратиться к коллекции searchResult. Чтобы получить имена групп, выполните перечисление через индексы и получите либо «Имя участника-пользователя», либо «Имя учетной записи SAM».
Да, проверка подлинности с помощью форм не так хорошо работает с Active Directory, но дайте мне знать, поможет ли это. Я не знаком с подходом из предыдущего ответа; эти два разных ответа могут дать вам объекты, которые дадут вам доступ к разным функциям.
Вы можете сделать метод расширения для вашего класса пользователя, чтобы получить коллекцию всех ролей в системе (спрашивая вашего поставщика ролей), сделать цикл (или использовать linq), чтобы спросить isInRole для каждой роли и собрать пользовательские роли в свойство, готовое к использованию.
Этот способ может быть общим для любого типа провайдера ролей.