HttpContext.Current.User.IsInRole(“域\\域用户”)需要永远

时间:2014-04-24 22:43:55

标签: c# asp.net visual-studio-2012 active-directory httpcontext

确定这不是一个网络问题。我在调试(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 我试过重启 我已经尝试过一个新的测试人员网络项目 - 立即工作

问题似乎与机器有关。任何帮助,甚至只是建议其他故障排除步骤将不胜感激。

2 个答案:

答案 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;
}