【问题标题】:.net web service to validate LDAP credentials using SSL.net Web 服务使用 SSL 验证 LDAP 凭据
【发布时间】:2013-06-11 20:11:50
【问题描述】:

所以我对这里的整个 .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:验证用户时出错。服务器无法运行。

我觉得我只是在某处或类似的地方指定了错误的路径,但我似乎无法弄清楚。

【问题讨论】:

    标签: c# .net vb.net web-services ldap


    【解决方案1】:

    这似乎会创建一个看起来像"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 搜索,然后使用用户名和密码重新绑定。 Here 是来自 ASP.net 的一个很好的例子。但是,该示例要求用户名采用 uid 形式,您希望将其更改为 SAMAccountName

    另外,您似乎指定了 TLS 端口,但您没有指定 AuthenticationTypes.SecureSocketsLayer,这可能会导致您收到错误。

    【讨论】:

      【解决方案2】:

      根据您的代码,您将以下内容传递给 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-14
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多