Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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#_.net_Angular_Active Directory - Fatal编程技术网

C# 从客户端获取广告用户和组

C# 从客户端获取广告用户和组,c#,.net,angular,active-directory,C#,.net,Angular,Active Directory,是否有任何方法可以在intranet设置之外访问客户机、广告用户和组 我不是在寻找azure解决方案 我正在使用的技术是.Net核心web api和Angular作为前端 在我自己的域中检索广告信息是可以实现的,我可以获得用户主体, 但是,如果web API和AD不是托管在同一台服务器上,那么如何工作呢 var entry = new DirectoryEntry("LDAP://DC=DomainController,DC=com","UserName","P4$$w0Rd!??

是否有任何方法可以在intranet设置之外访问客户机、广告用户和组

我不是在寻找azure解决方案

我正在使用的技术是.Net核心web api和Angular作为前端

在我自己的域中检索广告信息是可以实现的,我可以获得用户主体, 但是,如果web API和AD不是托管在同一台服务器上,那么如何工作呢

       var entry = new DirectoryEntry("LDAP://DC=DomainController,DC=com","UserName","P4$$w0Rd!???"); 
       // userName password must be valid

        var searcher = new DirectorySearcher(entry);
        searcher.PropertiesToLoad.Add("sn");
        var accName = "accNameToSearch"; // you can also use wildcart 
        // https://docs.microsoft.com/en-us/windows/win32/adsi/search-filter-syntax
        searcher.Filter = $"(&(objectCategory=person)(objectClass=user)(sAMAccountName={accName}))"; 
        var result = searcher.FindOne();
        var sn = result.Properties["sn"];

该nuget包还没有UserPrincipal类。但是您仍然可以使用上面的广告查询语法查询用户和其他内容。

我不能确切地告诉您如何执行此操作,因为我还没有使用.NET Core完成此操作,但我可以告诉您需要执行哪些操作,并且您可以查看每个部分的更多详细信息

  • 使用表单身份验证。你将需要一个登录页面,要求他们的用户名和密码
  • 验证凭据。有几种方法可以做到这一点。我最喜欢的是in,它使用的是
    LdapConnection
    from,因为这是执行此任务所需的最少网络请求量,它会告诉您凭据失败的原因(例如,如果用户的密码已过期,您可以将其带到“更改密码”页面)。但是,使用
    DirectoryEntry
    /
    DirectorySearcher
    更容易查找组,因此您可能还希望通过在
    DirectoryEntry
    的构造函数中使用用户的凭据来进行验证(但您将无法知道尝试失败的原因)
  • 查找用户的帐户。我更喜欢使用中的
    DirectoryEntry
    /
    DirectorySearcher
    。艾达的回答说明了如何做到这一点
  • 查找用户的组。我写了一整篇关于这个的文章:。假设您的环境中只有一个域,并且您已经为用户帐户设置了一个
    DirectoryEntry
    对象,则此代码将起作用:
  • private静态IEnumerable GetUserMemberOf(DirectoryEntry de){
    变量组=新列表();
    //仅从用户检索memberOf属性
    de.RefreshCache(新[]{“memberOf”});
    while(true){
    var memberOf=de.Properties[“memberOf”];
    foreach(memberOf中的字符串组){
    var groupDe=newdirectoryEntry($“LDAP://{group.Replace(“/”,“\\/”));
    groupDe.RefreshCache(新[]{“cn”});
    groups.Add(groupDe.Properties[“cn”]值作为字符串);
    }
    //AD一次只能提供1000或1500(取决于服务器版本)
    //如果我们找到了,去看看还有没有
    如果(memberOf.Count!=1500&&memberOf.Count!=1000)中断;
    试一试{
    de.RefreshCache(新的[]{$”memberOf;范围={groups.Count}-*“});
    }捕获(COMException e){
    如果(e.ErrorCode==unchecked((int)0x80072020))中断;//没有更多结果
    投掷;
    }
    }
    返回组;
    }
    

    如果您的环境中有多个域,则会有点复杂。

    要检索广告信息,您需要有一个经过身份验证的用户与您正在建立的连接相关联。默认情况下,不允许匿名用户进行查询,并且您已经知道System.DirectoryServices nuget软件包。当您说“get UserPrinciples”时,这是否意味着您正在使用Windows身份验证,或者您正在使用手动查找帐户,例如,
    PrincipalSearcher
    将返回一个
    UserPrincipal
    ?@Eldar您能告诉我有关用户身份验证的任何方向吗?是的,System.DirectoryServices是我的计划using@GabrielLuci我还没有构建这个应用程序,但是这个功能对它至关重要。所以我正在事先研究可能性。我想获得他/她的域上的客户广告组(可能是用户访问站点时进行身份验证),如果这是在intranet设置中,用户使用他们将登录到您的站点的广告帐户登录到他们的计算机,那么您可以实现,我如何从访问站点的客户那里获得用户名和密码?此DirectorySearcher是否可以在intranet设置之外使用?难以置信,如果服务器/网站托管在客户端网络之外,是否可以使用此功能?例如,如果我有两个用户位于不同的城市,他们有自己的本地广告域,我可以得到他们每个人的广告组数据?是的。您只需确保没有防火墙阻止访问。您可以在LDAP字符串中指定服务器,如
    LDAP://example.com
    。默认情况下,它将使用端口389,但如果要使用加密,则必须指定端口636:
    LDAP://example.com:636
    (并且还必须信任它们使用的证书)。
    private static IEnumerable<string> GetUserMemberOf(DirectoryEntry de) {
        var groups = new List<string>();
    
        //retrieve only the memberOf attribute from the user
        de.RefreshCache(new[] {"memberOf"});
    
        while (true) {
            var memberOf = de.Properties["memberOf"];
            foreach (string group in memberOf) {
                var groupDe = new DirectoryEntry($"LDAP://{group.Replace("/", "\\/")}");
                groupDe.RefreshCache(new[] {"cn"});
                groups.Add(groupDe.Properties["cn"].Value as string);
            }
    
            //AD only gives us 1000 or 1500 at a time (depending on the server version)
            //so if we've hit that, go see if there are more
            if (memberOf.Count != 1500 && memberOf.Count != 1000) break;
    
            try {
                de.RefreshCache(new[] {$"memberOf;range={groups.Count}-*"});
            } catch (COMException e) {
                if (e.ErrorCode == unchecked((int) 0x80072020)) break; //no more results
    
                throw;
            }
        }
        return groups;
    }