[英].net web service to validate LDAP credentials using SSL
因此,我对整个.net还是陌生的,但是基本上我想做的是编写一个Web服务,该服务将接收带有用户名和密码的SOAP请求,并在ldap服务器上检查它们以验证凭据是否正确。 我已经在perl中完成了此操作,代码在下面,但是我想在.net中复制它,以进一步了解它。 我一直在使用c#,因为我已经做了大量的Java编程,而且看起来它们很相似,但是如果在vb或其他方面更容易,我不反对。
我遇到的主要问题实际上是连接到服务器本身。 我在网上找到了一些示例,但是对于应该传递给各种方法的内容我感到困惑。 这是Web服务的perl版本:
authenticate.cgi
use strict;
use warnings;
use SOAP::Transport::HTTP;
SOAP::Transport::HTTP::CGI
->dispatch_to('Authenticate')
->handle;
package Authenticate;
use Net::LDAPS;
use Net::LDAP;
sub Verify{
my ($class, $user, $pass) = @_;
my $user_dn = "uid=$user,ou=people,o=domain";
my $ldap = Net::LDAPS->new( 'ldap.domain.com', port => '636' ) or die "$@";
my $mesg = $ldap->bind($user_dn, password => $pass);
return $mesg->error if $mesg->is_error;
return "Successful authentication for user '$user'";
}
我一直在用C#弄乱的是以下内容(我可能有不必要的包含,我一直在弄乱一堆东西):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.DirectoryServices;
using System.DirectoryServices.Protocols;
using System.Net;
/// <summary>
/// Summary description for WebService
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService {
public WebService () {
//Uncomment the following line if using designed components
//InitializeComponent();
}
[WebMethod]
public string Authenticate(string username, string pwd) {
string domain = "LDAP://ldap.domain.com:636";
string domainAndUsername = domain + @"\" + username;
string path = domain + @"/ou=people,o=domain";
string filterAttribute;
DirectoryEntry entry = new DirectoryEntry(path, domainAndUsername, pwd);
try
{
//Bind to the native AdsObject to force authentication.
object obj = entry.NativeObject;
DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(SAMAccountName=" + username + ")";
search.PropertiesToLoad.Add("cn");
SearchResult result = search.FindOne();
if (null == result)
{
return "false";
}
//Update the new path to the user in the directory.
path = result.Path;
filterAttribute = (string)result.Properties["cn"][0];
}
catch (Exception ex)
{
throw new Exception("Error authenticating user. " + ex.Message);
}
return "true";
}
}
这导致了错误
System.Exception:验证用户时出错。 服务器无法运行。
我觉得我只是在某处或类似的地方指定了错误的路径,但我似乎无法弄清楚。
似乎这将创建一个看起来像"LDAP://ldap.domain.com:636\\username/ou=people,o=domain"
的路径。 通常,它将是"LDAP://ldap.domain.com:636/cn=Full User Common Name,ou=People,dc=domain,dc=local"
。
如果没有DN,则应匿名绑定或使用服务凭证绑定,使用SAMAccountName
搜索,然后使用用户名和密码重新绑定。 这是来自ASP.net的一个很好的示例。 但是,该示例希望用户名采用uid
形式,您需要将其更改为SAMAccountName
同样,您似乎在指定TLS端口,但尚未指定AuthenticationTypes.SecureSocketsLayer
,这可能会导致收到错误。
根据您的代码,将以下内容传递给DirectoryEntry
构造函数:
路径: LDAP://ldap.domain.com:636/ou=people,o=domain
用户名: LDAP://ldap.domain.com:636\\username
该用户名不正确。 如果是Active Directory, ldap.domain.com\\username
但看起来不是Active Directory。 因此,您应提供用户的专有名称。 从您的perl看来,它应该是uid=username,ou=people,o=domain
,但这对我来说很奇怪。 我总是将其视为cn=username,ou=people,o=domain
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.