【问题标题】:HttpContext.Current.User.IsInRole("Domain\\Domain Users") takes foreverHttpContext.Current.User.IsInRole("Domain\\Domain Users") 需要永远
【发布时间】:2014-04-24 22:43:54
【问题描述】:

确定这不是网络问题。我在调试时遇到了这个问题(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 并拉出域用户组,并立即查看其中的所有人(有超过 10,000 个用户) - 没问题。那么,这一定是基于项目/配置的问题吗?

我想弄清楚这一点。一些信息:

尝试重新安装 IIS Express 我试过重启 我已经尝试过一个新的测试网络项目 - 立即工作

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

【问题讨论】:

  • 第二次调用更快,因为信息被缓存了。
  • 那为什么在检查其他组后会更快?整个 AD 数据库肯定没有被缓存。
  • 想到了什么,可能是环境问题。如果 DNS 中的域控制器出现故障,则可能会导致超时,这可能会随机导致 LDAP 连接变慢。每次第一次查询都很慢吗?
  • 是的 - 非常一致。我的测试仪项目也是如此。它非常一致地快速。我所做的只是用一个页面创建一个新的 Web 项目。

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


【解决方案1】:

尝试改用 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. 为什么这个速度很快,但是从 httpcontext 中搜索却很慢? 2.为什么只有一些项目会出现这种情况,就像我创建一个新项目一样,这两种方法都很快。 3. 最后,使用这个命名空间和以前的主要区别是什么?我意识到直到 .net 3.5 和仅供参考:我已经有了这个 msdn.microsoft.com/en-us/library/…
  • @maplemale 我希望我能告诉你。我编写了在工作中与 AD 交互的应用程序,并且我尝试了所有可能的方法来找到最佳方法。 System.DirectoryServices.AccountManagement 命名空间在很多事情上我仍然没有使用旧的 System.DirectoryServices 东西快,但是当涉及到这种事情时,它非常容易使用并且对于大多数应用程序来说足够快。我建议我的代码可以很容易地改进,特别是如果您需要检查多个组。也许其他人可以解释其中的区别。
【解决方案2】:

我遇到了同样的问题。 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 2021-12-01
    • 2019-09-06
    • 2021-05-14
    • 2013-12-08
    • 2021-01-02
    相关资源
    最近更新 更多