获取用户在字符串变量中的角色

时间:2010-01-21 05:26:30

标签: c# asp.net role

有没有办法可以使用以下命令在字符串变量中获取角色....

 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

as string role = wp.IsInRole();
但这不对

类似于此......

6 个答案:

答案 0 :(得分:6)

您可以从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组/角色。

答案 1 :(得分: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.Join http://msdn.microsoft.com/en-us/library/57a79xd0.aspx

希望这有帮助。

答案 2 :(得分:2)

你似乎在搅拌苹果和橘子。您使用的是Windows还是Forms身份验证?

在任何一种情况下,您都可以从RoleProvider获取用户的角色(如果已实现)。

检查线程的当前主体只会公开一个check方法,如你所知,IsInRole,而角色提供者将返回一个用户所属角色的字符串数组。

但我不得不问你为什么要把一个角色包装进门票?我能看到的唯一有效的用例是你正在整合外部认证/角色孤岛。

如果您更充分地解释您的方案和要求,我相信我们可以找到解决您问题的具体方案。

答案 3 :(得分: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;
    }
}

答案 4 :(得分:0)

是的,表单身份验证似乎与Windows身份相冲突,但我写了一些代码,我相信它会按照你的要求行事。

首先,在项目中添加对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集合。要获取组名,请枚举索引并检索“用户主体名称”或“SAM帐户名称”。

是的,表单身份验证与Active Directory不能很好地兼容,但请告诉我这是否有帮助。我不熟悉上一个答案中的方法;这两个不同的答案可能会为您提供允许您访问不同功能的对象。

答案 5 :(得分:0)

您可以对您的用户类执行扩展方法,以获取系统中所有角色的集合(请求您的角色提供者)执行cicle(或使用linq)来询问isInRole foreach角色并收集用户角色准备好使用的财产。

这可以是任何类型的角色提供者的通用方式。