получить роль пользователя в строковой переменной - PullRequest
5 голосов
/ 21 января 2010

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

 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

как string role = wp.IsInRole ();
но это не правильно

что-то похожее на это ...

Ответы [ 6 ]

6 голосов
/ 23 января 2010

Вы можете получить список групп / ролей, в которые входит пользователь, из свойства WindowsIdentity.Groups. Коллекция WindowsIdentity.Groups содержит только SID (коллекция IdentityReference) групп / ролей, в которых находится пользователь, но не фактические имена групп / ролей. Я покажу вам, как получить фактические названия всех групп / ролей, в которых находится пользователь.

Сначала получите объект WindowsIdentity.

WindowsIdentity identity = WindowsIdentity.GetCurrent();

Во-вторых, используйте LINQ для перевода SID (IdentityReference) в NTAccount.

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

Затем вы можете перебирать группы и сохранять их в строковом массиве, который можно использовать в FormsAuthenticationTicket. Это даст вам как группы / роли BUILTIN (локальный компьютер), так и группы / роли DOMAIN, в которых находится пользователь.

4 голосов
/ 21 июля 2011

Для получения ролей: 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.Join http://msdn.microsoft.com/en-us/library/57a79xd0.aspx

Надеюсь, это поможет.

2 голосов
/ 10 февраля 2010

Вы, кажется, смешиваете яблоки и апельсины. Вы используете проверку подлинности Windows или Forms?

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

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

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

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

1 голос
/ 21 января 2010

Как так?

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;
    }
}
0 голосов
/ 23 февраля 2010

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

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

0 голосов
/ 11 февраля 2010

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

Прежде всего, добавьте ссылку на System.DirectoryServices в ваш проект.

Сначала необходимо инициализировать объект PrincipalContext.

imports System.DirectoryServices

Dim userImLookingFor as AccountManagement.UserPrincipal(ctx)Dim tempUser As New AccountManagement.UserPrincipal(ctx)tempUser.SamAccountName = p_samAccountNameDim searcher As New AccountManagement.PrincipalSearcher(tempUser)If searcher.FindAll().Count = 1 ThenuserImLookingFor = 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.Чтобы получить имена групп, перечислите их по индексам и получите либо «Имя участника-пользователя», либо «Имя учетной записи SAM».

Да, проверка подлинности с помощью форм не очень хорошо работает с Active Directory, но позвольте мнезнаю, поможет ли это.Я не знаком с подходом в предыдущем ответе;эти два разных ответа могут дать вам объекты, которые дают вам доступ к различным функциям.

...