C# Firefox中的UserPrincipal.FindByIdentity错误

C# Firefox中的UserPrincipal.FindByIdentity错误,c#,asp.net-mvc-4,authentication,principalcontext,C#,Asp.net Mvc 4,Authentication,Principalcontext,我有一个方法来检索用户所属的广告组列表。代码如下: public static List<GroupPrincipal> GetGroups(string userName) { List<GroupPrincipal> result = new List<GroupPrincipal>(); // establish domain context PrincipalCo

我有一个方法来检索用户所属的广告组列表。代码如下:

public static List<GroupPrincipal> GetGroups(string userName)
        {
            List<GroupPrincipal> result = new List<GroupPrincipal>();

            // establish domain context
            PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain);
            UserPrincipal user = null;

            // find your user
           user = UserPrincipal.FindByIdentity(yourDomain, userName);

            // if found - grab its groups
            if (user != null)
            {
                PrincipalSearchResult<Principal> groups = user.GetGroups();   

                // iterate over all groups
                foreach (Principal p in groups)
                {
                    // make sure to add only group principals
                    if (p is GroupPrincipal)
                    {
                        result.Add((GroupPrincipal)p);
                    }
                }
            }

            return result;
        }
公共静态列表GetGroups(字符串用户名)
{
列表结果=新列表();
//建立域上下文
PrincipalContext yourDomain=新PrincipalContext(ContextType.Domain);
UserPrincipal user=null;
//查找您的用户
user=UserPrincipal.FindByIdentity(您的域,用户名);
//如果找到-抓取它的组
如果(用户!=null)
{
PrincipalSearchResult groups=user.GetGroups();
//迭代所有组
foreach(组中的主体p)
{
//确保只添加组主体
if(p是GroupPrincipal)
{
结果。添加((GroupPrincipal)p);
}
}
}
返回结果;
}

在IE和Chrome中,这都可以很好地工作,但在Firefox中,它总是在
user=UserPrincipal.FindByIdentity(yourDomain,userName)上给我DirectoryServicesComeException 将调用更改为如下所示:

using (HostingEnvironment.Impersonate()){
    user = UserPrincipal.FindByIdentity(yourDomain, userName); 
}

您需要确保应用程序池具有AD权限。这将使用宿主环境的凭据(web应用程序池标识)而不是用户的凭据执行底层AD调用,用户可能没有查询AD服务器的权限。

作为测试,请尝试使用(HostingEnvironment.Impersonate()){…}
调用将该行放入
中,然后查看是否修复了它。运行应用程序池的帐户将需要广告访问。它现在可以工作!!非常感谢。你能给我解释一下吗?为什么它适用于IE和Chrome,而不适用于Firefox?不太确定为什么,当我使用IE和Chrome时,它可以找到用户刚才找到的,但如果我使用Firefox,它会给我一个期望。所有3个浏览器在如何向web服务器传递凭据方面都有点不同。我不记得Firefox到底有什么不同,但我记得我们必须将它与其他浏览器分开使用。。。