Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Active Directory UserPrincipal.Current.GetGroups()返回本地而非web服务器上的组_C#_Asp.net_Active Directory - Fatal编程技术网

C# Active Directory UserPrincipal.Current.GetGroups()返回本地而非web服务器上的组

C# Active Directory UserPrincipal.Current.GetGroups()返回本地而非web服务器上的组,c#,asp.net,active-directory,C#,Asp.net,Active Directory,以下内容对我的本地开发箱非常有用。但是,当我将其移动到web服务器时,它会失败,甚至不会记录错误: public static List<string> getAuthorizationGrps(string userName) { List<string> grps = new List<string>(); try { PrincipalSearchResult<Pri

以下内容对我的本地开发箱非常有用。但是,当我将其移动到web服务器时,它会失败,甚至不会记录错误:

public static List<string> getAuthorizationGrps(string userName)
    {
        List<string> grps = new List<string>();

        try
        {
            PrincipalSearchResult<Principal> groups = UserPrincipal.Current.GetGroups();
            IEnumerable<string> groupNames = groups.Select(x => x.SamAccountName);
            foreach (var name in groupNames)
            {
                grps.Add(name.ToString());
            }
            return grps;
        }
        catch (Exception ex)
        {
            Log.WriteLog("Error in retriving form data: " + ex.Message);
        }
    }
公共静态列表getAuthorizationGrps(字符串用户名)
{
List grps=新列表();
尝试
{
PrincipalSearchResult groups=UserPrincipal.Current.GetGroups();
IEnumerable groupname=groups.Select(x=>x.SamAccountName);
foreach(groupNames中的变量名)
{
Add(name.ToString());
}
返回GRP;
}
捕获(例外情况除外)
{
Log.WriteLog(“检索表单数据时出错:“+ex.Message”);
}
}
是否必须在Web服务器上设置权限才能查询组?我可以在本地和web服务器上毫无问题地获取当前用户


任何想法都将不胜感激,我已经为此奋斗了两天了

大约6个月前,我们遇到了类似的问题。我们的代码调用UserPrincipal.Current.GetGroups()并在foreach循环中枚举对象。在测试和生产中工作良好,直到一天早上,一位同事在代码执行时不断出现异常。枚举groupNames对象开始引发IndexOutOfRangeException。一个小时后,我无法找出哪里出了问题,所以我在中添加了一个称为存储过程的乱码,该存储过程进行了ADSI调用,类似于在中的第二个答案。它并不漂亮,但从来没有出现过任何问题。

我想这就是您的环境

Web browser --> Web Server --> Domain Controller
除非在同一台计算机上运行
Web浏览器和Web服务器
Web服务器和域控制器
,否则需要设置Kerberos委派以使上述代码正常工作。我猜您的开发程序正在运行,因为您在同一台机器上运行Web浏览器和Web服务器

您可以很容易地在Google上找到大量文章,教您如何为IIS和ASP.NET配置Kerberos委派。这是。我这里不谈细节。关键是您的ASP.NET应用程序正在模拟客户端凭据,并尝试使用该客户端凭据来查询Active Directory。如果你没有 如果委派设置正确,Windows将认为您的模拟凭据无法访问网络。在您的情况下,您无法访问域控制器。这是一项安全措施。这只是为了确保服务器不能代表网络上的最终用户执行操作,除非明确授予它这样做的权限

另一个解决方案是更改代码。因此,在调用GetGroups之前,先撤消模拟并再次成为IIS AppPool帐户。如果您的AppPool帐户配置为具有足够权限读取Active Directory的域帐户,则您可以在Active Directory中查询用户组

下面是一个关于这个的讨论。这是我认为它应该在没有任何Kerberos委派设置的情况下工作的代码。但是我没有测试它

public static List<string> getAuthorizationGrps(string userName)          
{          
    List<string> grps = new List<string>();          

    try          
    {
        var currentUser = UserPrincipal.Current;
        RevertToSelf();             
        PrincipalSearchResult<Principal> groups = currentUser.GetGroups();          
        IEnumerable<string> groupNames = groups.Select(x => x.SamAccountName);          
        foreach (var name in groupNames)          
        {          
            grps.Add(name.ToString());          
        }          
        return grps;          
    }          
    catch (Exception ex)          
    {          
        Log.WriteLog("Error in retriving form data: " + ex.Message);          
    }          
}      
公共静态列表getAuthorizationGrps(字符串用户名)
{          
List grps=新列表();
尝试
{
var currentUser=UserPrincipal.Current;
restortoself();
PrincipalSearchResult groups=currentUser.GetGroups();
IEnumerable groupname=groups.Select(x=>x.SamAccountName);
foreach(groupNames中的变量名)
{          
Add(name.ToString());
}          
返回GRP;
}          
捕获(例外情况除外)
{          
Log.WriteLog(“检索表单数据时出错:“+ex.Message”);
}          
}      

我正在使用Net 4.0。无论出于什么原因,您提供的代码都不起作用。但是,按照您的基本步骤,我将应用程序池更改为在网络服务下运行,现在我可以完成获取用户的任务。谢谢您需要自己声明retertoself。这是一种呕吐物。查看博客如何声明它