2010-01-21 10 views
5

hay una manera que puedo conseguir el papel en una variable de cadena usando los siguientes comandos ....obtener papel del usuario en una variable de cadena

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

que necesito esto para

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

como string role = wp.IsInRole();
pero esto no es correcto

algo similar a esto ...

Respuesta

1

Al igual que?

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

Usted puede obtener una lista de grupos/roles que un usuario es parte de la propiedad de WindowsIdentity.Groups. La colección WindowsIdentity.Groups solo contiene los SID (colección de IdentityReference) de los grupos/roles en los que se encuentra un usuario, pero no los nombres reales de los grupos/roles. Le mostraré cómo obtener los nombres reales de todos los grupos/roles en los que se encuentra un usuario.

Primero, obtenga el objeto WindowsIdentity.

WindowsIdentity identity = WindowsIdentity.GetCurrent(); 

En segundo lugar, utilizar LINQ para traducir del SID (IdentityReference) a NTAccount de.

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

A continuación, puede recorrer los grupos y almacenarlos en una matriz de cadenas que puede ser utilizado en el FormsAuthenticationTicket. Esto le proporcionará los grupos/roles BUILTIN (computadora local) y también los grupos/roles de DOMINIO en los que se encuentra el usuario.

2

Parece que está mezclando manzanas y naranjas. ¿Estás usando Windows o autenticación de formularios?

En cualquier caso, puede obtener las funciones del usuario de RoleProvider, si está implementado.

Al examinar el principio actual del subproceso, solo se expone un método de comprobación, como ya sabe, IsInRole, mientras que el proveedor de funciones devolverá una matriz de cadenas de funciones a las que pertenece el usuario.

Pero tengo que preguntar ¿por qué está empaquetando un papel (s) en el boleto? El único caso de uso válido que puedo ver para esto es que está consolidando silos de autenticación/rol externos.

Si explica su situación y requisitos con más detalle, estoy seguro de que podemos encontrar una solución específica a su problema.

0

Sí, la Autenticación de formularios parece entrar en conflicto con las identidades de Windows, pero he escrito algunos códigos que creo que harán lo que usted solicite.

Antes que nada, agregue una referencia a System.DirectoryServices a su proyecto.

Primero debe inicializar un objeto 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)

Cuando se ejecuta este código, userImLookingFor contiene el usuario especificado por p_samAccountName. Luego, desea obtener una lista de los grupos.

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()

Por último, es posible referirse a la colección SearchResult. Para obtener los nombres de los grupos, enumere a través de los índices y recupere el "Nombre principal del usuario" o el "Nombre de la cuenta SAM".

Sí, la Autenticación de formularios no funciona tan bien con Active Directory, pero avíseme si esto ayuda. No estoy familiarizado con el enfoque en la respuesta anterior; estas dos respuestas diferentes pueden darle objetos que le dan acceso a diferentes funcionalidades.

0

Puede hacer un método de extensión para su clase de usuario, para obtener la colección de todos los Roles en el sistema (solicitando a su proveedor de Role) haga un ciclo (o use linq) para solicitar el rol de isInRole foreach y recopilar el usuario Roles en una propiedad lista para usar.

Esa puede ser una forma genérica para cualquier tipo de proveedor de roles.

4

para obtener Roles: http://msdn.microsoft.com/en-us/library/system.web.security.roles.getrolesforuser.aspx

Uso Roles.GetRolesForUser() o Roles.GetRolesForUser(Page.User.Identity.Name) para obtener una matriz de los roles que el usuario actual tiene. Puede especificar para qué usuario desea obtener los roles por Roles.GetRolesForUser("Specific UserName")

Puede usar String.Join(", ",Roles.GetRolesForUser()) para obtener una serie de funciones que tiene el usuario.

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

Espero que esto ayude.

Cuestiones relacionadas