有没有办法可以使用以下命令在字符串变量中获取角色....
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();
但这不对
类似于此......
答案 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角色并收集用户角色准备好使用的财产。
这可以是任何类型的角色提供者的通用方式。