我以前没有做过任何基于LDAP的身份验证,而且以前也没有使用过任何LDAP服务器。因此,我需要一个免费的在线LDAP服务器来使用它,我已经找到了https://www.forumsys.com/tutorials/integration-how-to/ldap/online-ldap-test-server/
但是我的代码不起作用(或者我不确定那里的信息已经无效),authen的结果始终为false,这是我的代码:
path = "ldap.forumsys.com:389/dc=example,dc=com";
using (var pc = new PrincipalContext(ContextType.Domain, null, path))
{
//this always returns false
var ok = pc.ValidateCredentials("read-only-admin", "password");
}
您能使其正常工作吗?或者至少请断言那里的信息无效,在这种情况下,如果可能的话,请给我一些其他信息(从其他免费的LDAP服务器进行测试)。
答案 0 :(得分:0)
似乎read-only-admin
不是有效用户。尝试更换:
var ok = pc.ValidateCredentials("read-only-admin", "password");
使用
var ok = pc.ValidateCredentials("tesla", "password");
如果这不起作用,则另一个问题将在LDAP的服务器端。
一个不错的选择是设置Amazon Web Services EC2服务器(免费)并将Windows Server加载到该服务器上。这将为您提供您自己的服务器,并且您将学习如何设置LDAP服务器(这非常简单)。
答案 1 :(得分:0)
我认为服务器不是Active Directory。您可以参考this question了解如何使用C#连接到LDAP服务器。
第二次修改:
与MS人员确认。他们还建议使用LdapConnection
。
https://github.com/dotnet/corefx/issues/31809
编辑:
我可以使用DirectoryEntry绑定到服务器。我不确定PrincipalContext为什么不起作用,但是您可以尝试这种方式。
这是用于验证用户名和密码的示例代码。
已在带有System.DirectoryServices
软件包4.5.0的.Net Core 2.1上进行了测试。
using System;
using System.DirectoryServices;
namespace LDAPTest
{
class Program
{
static void Main(string[] args)
{
string ldapServer = "LDAP://ldap.forumsys.com:389/dc=example,dc=com";
string userName = "cn=read-only-admin,dc=example,dc=com";
string password = "password";
var directoryEntry = new DirectoryEntry(ldapServer, userName, password, AuthenticationTypes.ServerBind);
// Bind to server with admin. Real life should use a service user.
object obj = directoryEntry.NativeObject;
if (obj == null)
{
Console.WriteLine("Bind with admin failed!.");
Environment.Exit(1);
}
else
{
Console.WriteLine("Bind with admin succeeded!");
}
// Search for the user first.
DirectorySearcher searcher = new DirectorySearcher(directoryEntry);
searcher.Filter = "(uid=riemann)";
searcher.PropertiesToLoad.Add("*");
SearchResult rc = searcher.FindOne();
// First we should handle user not found.
// To simplify, skip it and try to bind to the user.
DirectoryEntry validator = new DirectoryEntry(ldapServer, "uid=riemann,dc=example,dc=com", password, AuthenticationTypes.ServerBind);
if (validator.NativeObject.Equals(null))
{
Console.WriteLine("Cannot bind to user!");
}
else
{
Console.WriteLine("Bind with user succeeded!");
}
}
}
}
参考: https://www.c-sharpcorner.com/forums/ldap-authentication2
答案 2 :(得分:0)
我也知道了这一点,并且不具备LDAP知识。
您的解决方案中的问题可能首先是,您正在使用“ ldap://”而不是“ LDAP://”,因为这是我在编写此代码时遇到的。但是我使用System.DirectoryServices库。
我针对这个宏伟的free to test LDAP server
进行了测试var path = "LDAP://ldap.forumsys.com:389/dc=example,dc=com";
var user = $@"uid={username},dc=example,dc=com";
var pass = "password";
var directoryEntry = new DirectoryEntry(path, user, pass, AuthenticationTypes.None);
var searcher = new DirectorySearcher(directoryEntry);
searcher.PropertiesToLoad.Add("*");
var searchResult = searcher.FindOne();
但是,我不完全了解所有这些行的用途,并且寻找解决方案时,我发现了一些建议。
在路径上,“ LDAP://”字符串应位于mayus块上。
在用户中,有时您需要使用“ cn = username-admin”来验证管理员,请确保还将“身份验证”类型设置为ServerBind。