.net web服务使用SSL验证LDAP凭据

本文关键字:验证 LDAP 凭据 SSL web 服务 net | 更新日期: 2023-09-27 18:17:52

所以我对这里的整个。net事情都很陌生,但基本上我想做的是编写一个web服务,它将接受带有用户名和密码的SOAP请求,并根据ldap服务器检查它们以验证凭据是否正确。我已经在perl中完成了这一点,代码如下,但我想在。net中复制它以获得更多的接触。自从我做了大量的java编程以来,我一直在摸索c#,看起来它们非常相似,但如果在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";
    }
}

这导致了错误

系统。异常:用户认证错误。

服务器无法运行。

我觉得我只是指定路径错误的地方或类似的东西,但我似乎不能弄清楚。

.net web服务使用SSL验证LDAP凭据

这似乎会创建一个看起来像"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

用户名不正确。如果是"活动目录",你会输入ldap.domain.com'username,但它看起来不像"活动目录"。所以你应该给出用户的区别名。从你的perl,它看起来应该是uid=username,ou=people,o=domain,但这对我来说看起来很奇怪。我总是把它看作cn=username,ou=people,o=domain