确定这不是一个网络问题。我在调试(VS2012 / .Net 4.5 / IIS Express 8.0)中遇到此问题
代码:
bool rtn2 = HttpContext.Current.User.IsInRole("MyDomain\\Domain Users");
最终返回true。但是,可能需要几分钟。
var test = HttpContext.Current;
var test2 = HttpContext.Current.User;
var test3 = HttpContext.Current.User.Identity;
......一切都非常快。
var test = HttpContext.Current.User.IsInRole("MyDomain\\Domain Users");
var test2 = HttpContext.Current.User.IsInRole("MyDomain\\Domain Users");
第一次通话需要几分钟,第二次是即时通话。如果我改变第二个以寻找其他组(假设第一个被缓存),它仍然是即时的。
我想也许我有网络问题(我连接到域并通过VPN进行调试。)但是,如果我创建一个新的VS2012 Web项目并将该代码放在启动页面中,它就会出现问题。瞬间。我也可以从我的机器上搜索Active Directory并启动Domain Users组并立即查看其中的所有人(有超过1万用户) - 没问题。那么,这必须是基于项目/配置的问题吗?
想出想办法解决这个问题。一些信息:
尝试重新安装IIS Express 我试过重启 我已经尝试过一个新的测试人员网络项目 - 立即工作
问题似乎与机器有关。任何帮助,甚至只是建议其他故障排除步骤将不胜感激。
答案 0 :(得分:3)
请尝试使用System.DirectoryServices.AccountManagement
命名空间。
public static bool IsUserGroupMember(string userName, string groupName)
{
using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
using (UserPrincipal user = UserPrincipal.FindByIdentity(context, userName))
using (PrincipalSearchResult<Principal> groups = user.GetAuthorizationGroups())
{
return groups.OfType<GroupPrincipal>().Any(g => g.Name.Equals(groupName, StringComparison.OrdinalIgnoreCase));
}
}
答案 1 :(得分:1)
我遇到了同样的问题。 IsInRole将永远在生产服务器上完成。以下代码改为工作。在某个地方看到它,遗憾的是不记得来源。
// Is in AD Group?
private static bool IsInADGroup(String inGroup)
{
foreach (System.Security.Principal.IdentityReference group in
System.Web.HttpContext.Current.Request.LogonUserIdentity.Groups)
{
String sGroup = (group.Translate(typeof(System.Security.Principal.NTAccount)).ToString());
if (sGroup.Equals(inGroup))
return true;
}
return false;
}