получите роль пользователя в строковой переменной

есть ли способ, которым я могу получить роль в строковой переменной с помощью ниже команд....

 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 ();
но это не правильно

что-то подобное этому...

5
задан user175084 21 January 2010 в 15:31
поделиться

5 ответов

Вы можете получить список групп / ролей, что пользователь является частью свойства 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. Это заставит вас как встроенные (локальные компьютерные) группы / роли, а также доменные группы / роли, в которых используется пользователь.

6
ответ дан 18 December 2019 в 14:46
поделиться

Мне нравится?

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;
    }
}
1
ответ дан 18 December 2019 в 14:46
поделиться

Кажется, вы смешиваете яблоки и апельсины. Используете ли вы аутентификацию Windows или Forms?

В любом случае вы можете получить роли пользователя из RoleProvider, если он реализован.

Проверка текущего принципала потока предоставляет только метод проверки, как вы знаете, IsInRole, тогда как поставщик ролей возвращает строковый массив ролей, к которым принадлежит пользователь.

Но я должен спросить, почему вы упаковываете роль (роли) в билет? Единственный допустимый вариант использования, который я вижу для этого, - это объединение внешних разрозненных аутентификаций / ролей.

Если вы более подробно объясните свой сценарий и требования, я уверен, что мы сможем найти конкретное решение вашей проблемы.

2
ответ дан 18 December 2019 в 14:46
поделиться

Да, проверка подлинности с помощью форм конфликтует с идентификаторами 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, но дайте мне знать, поможет ли это. Я не знаком с подходом из предыдущего ответа; эти два разных ответа могут дать вам объекты, которые дадут вам доступ к разным функциям.

0
ответ дан 18 December 2019 в 14:46
поделиться

Вы можете сделать метод расширения для вашего класса пользователя, чтобы получить коллекцию всех ролей в системе (спрашивая вашего поставщика ролей), сделать цикл (или использовать linq), чтобы спросить isInRole для каждой роли и собрать пользовательские роли в свойство, готовое к использованию.

Этот способ может быть общим для любого типа провайдера ролей.

0
ответ дан 18 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: