C# Active Directory UserPrincipal.Current.GetGroups()返回本地而非web服务器上的组
以下内容对我的本地开发箱非常有用。但是,当我将其移动到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
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。这是一种呕吐物。查看博客如何声明它