Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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# 从域外查询广告用户_C#_Asp.net_Active Directory_Cross Domain - Fatal编程技术网

C# 从域外查询广告用户

C# 从域外查询广告用户,c#,asp.net,active-directory,cross-domain,C#,Asp.net,Active Directory,Cross Domain,我有一个ASP.NET web应用程序,需要它对Active Directory连接进行身份验证并从中检索用户列表。问题是运行web服务器的机器是工作组的一部分(不是我正在使用的域)。我可以通过输入域名对广告进行身份验证,但检索用户列表失败 我的问题是,我试图从域外获取广告用户是否做错了什么?如果是,我可以做些什么来纠正这一点?我的代码片段如下: public bool IsAuthenticated(string username, string pwd) { try

我有一个ASP.NET web应用程序,需要它对Active Directory连接进行身份验证并从中检索用户列表。问题是运行web服务器的机器是工作组的一部分(不是我正在使用的域)。我可以通过输入域名对广告进行身份验证,但检索用户列表失败

我的问题是,我试图从域外获取广告用户是否做错了什么?如果是,我可以做些什么来纠正这一点?我的代码片段如下:

 public bool IsAuthenticated(string username, string pwd)
 {
     try
     {
         validUser = adContext.ValidateCredentials(username, pwd, ContextOptions.Negotiate);
     }
     catch (Exception ex)
     {
         Logging.Instance.Log(Logging.Levels.Error, "Error authenticating user: " + username + " : " + ex.Message.ToString());
     }
     return validUser;
 }


public List<DirectoryEntry> GetAllUsers()
{
    try
    {
        userADlist = new List<DirectoryEntry>();
        Logging.Instance.Log(Logging.Levels.Message, "Finding all users for: "+adContext.ConnectedServer + " " + adContext.Container);
        using (PrincipalSearcher searcher = new PrincipalSearcher(new UserPrincipal(adContext)))
        {
            foreach (Principal result in searcher.FindAll())
            {
                userADlist.Add(result.GetUnderlyingObject() as DirectoryEntry);
            }
        }
    }
    catch (Exception)
    {
        throw;
    }
    return userADlist;
}
public bool已验证(字符串用户名、字符串密码)
{
尝试
{
validUser=adContext.ValidateCredentials(用户名、密码、ContextOptions.Negotiate);
}
捕获(例外情况除外)
{
Logging.Instance.Log(Logging.Levels.Error,“验证用户时出错:“+username+”:“+ex.Message.ToString());
}
返回validUser;
}
公共列表GetAllUsers()
{
尝试
{
userADlist=新列表();
Logging.Instance.Log(Logging.Levels.Message,“查找所有用户:”+adContext.ConnectedServer+“”+adContext.Container);
使用(PrincipalSearcher=new PrincipalSearcher(new UserPrincipal(adContext)))
{
foreach(searcher.FindAll()中的主要结果)
{
添加(result.getUnderlineObject()作为DirectoryEntry);
}
}
}
捕获(例外)
{
投掷;
}
返回userADlist;
}

您的代码不显示创建
adContext
的位置。我只能怀疑:

在工作代码(
IsAuthenticated
)中,您只需检查给定的凭据(user+pw)是否正确

但是,如果您调用
GetAllUsers
,这些凭据不会“神奇地”重用,因此您与外部广告的绑定将失败

您可以使用
PrincipalContext
的构造函数,它接受user+pw。 ()

另请看:


然而,正如评论所示:使用明文密码不是一个好主意。

谢谢你的评论,我完全理解明文密码的风险

我不能使用建议的使用用户名和密码绑定PrincipalContext的方法,因为我不太愿意将其放入配置文件或硬编码

我采用的解决方法是在非域服务器上添加一个域用户帐户作为管理员,然后将其用作我的web应用程序的应用程序池标识。通过这种方式,IIS固有地使用帐户凭据向AD服务器进行身份验证,并且我可以正确地获得用户列表

谢谢你的帮助。
Rishi

Rainer Schaack就在这里。调用
GetAllUsers()
时,
IsAuthenticated
函数中的凭据将不用于绑定到中的AD。对此,一种解决方案是使用用户名和密码绑定到
PrincipalContext
。将凭据放入配置或硬编码存在风险。我想澄清的是,使用上面的代码,这些凭证不会以明文形式传递给不同域中的广告

验证上述凭据的行是:

validUser = adContext.ValidateCredentials(username, pwd, ContextOptions.Negotiate);
ContextOptions.agreement
在这里很重要。查看文档并解释
协商
选项使用或。调查时,这两者都不会使用明文传递凭据


也许在发帖时情况并非如此。我没有挖那么深去看。对于那些正在实施类似解决方案的人来说,理解这一点很重要。

请看一下此处的一些建议,谢谢,@MethodMan。我理解跨域通信可能受到限制的原因。我实际上能够通过明文传输密码以进行身份验证,但是检索用户列表失败了。我也知道可能没有更好的实现,但为了说服客户,我需要一些“弹药”。有什么官方文件可以给我指点吗?通过明文传递密码是一个明确的危险信号,希望你们知道。。听起来你需要想出一个安全的日志记录方法。我知道这一点,我清楚地把它作为一个潜在的问题传达给你。该应用程序将为客户驻留在本地intranet上,因此归根结底,他们不想为开发时间支付超过最低限度的费用。我不明白的是,如果服务器不在域中,为什么身份验证可以工作,但检索用户列表却不能。希望从dmz外部访问数据的个人是否可以创建一个Web服务,然后作为服务的一部分,使用guid或某个唯一ID来获取数据?并且只将密钥提供给将使用web服务的用户。。