簡體   English   中英

asp.net Web API的LDAP身份驗證

[英]LDAP Authentication for asp.net Web API

我正在使用ASP.NET技術進行WEB API項目。 該Web API需要從AD Active Directory檢查用戶,作為使用LDEP://域身份驗證

    [HttpGet]
    public IHttpActionResult ListProperties(string domainName, string userName, string password)
    {
        try
        {
            using (DirectoryEntry dEntry = new DirectoryEntry("LDAP://" + domainName, userName, password))
            {
                DirectorySearcher dSearcher = new DirectorySearcher(dEntry)
                {
                    Filter = "(&(objectClass=user)(mail=" + userName + "))"
                };
                SearchResult sResult = dSearcher.FindOne();
                Dictionary<string, string> resultDictionary = new Dictionary<string, string>
                {
                    {"Name", GetProperty(sResult,"cn")},
                    {"Email", GetProperty(sResult,"mail")}
                };

                return Ok(resultDictionary.ToList());
            }
        }
        catch (Exception ex)
        {
            return BadRequest(ex.Message);
        }
    }


    private string GetProperty(SearchResult searchResult, string propertyName)
    {
        if (searchResult.Properties.Contains(propertyName))
        {
            return searchResult.Properties[propertyName][0].ToString();
        }
        return string.Empty;
    }

所以我只用ajax調用此方法進行測試

$(document).ready(function () { 


    $.ajax({
        type: "GET",
        url: "../api/xxxxxxx/ListProperties",
        data: { domainName: "mydomain.xxx.xx", userName: "MyUsername", password: "MyPassword" },
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (data) { console.log(JSON.stringify(data)); },
        failure: function (data) { console.log(0); },
        error: function (data)   { console.log(1); }
    });
});

不幸的是,我總是收到錯誤的請求或以下錯誤

System.Runtime.InteropServices.COMException HResult=0x8007203A Message=The server is not operational.

您是否可以向我提供如何解決此問題的指南,因為我以前從未使用過安全編程。

該錯誤歸因於您的應用程序無法綁定到LDAP服務器。 首先,我建議將目標LDAP服務器添加到您的查詢字符串中,然后正確設置查詢字符串的格式以表示域DN=以及任何特定的組織單位OU=等。

查詢字符串如下所示:

LDAP://contoso.local/DC=contoso,DC=local

我在下面創建了一個示例,該示例使用GET (出於明顯的原因不建議使用)執行請求,並使用輔助方法將域轉換為友好的LDAP字符串。 響應將結果屬性輸出到JSON中,因此您可以控制自己認為合適的方式。

   public JsonResult CheckAdCreds(string server, string domain, string username, string password)
    {
        try
        {
            var ldapDomainString = LdapStringFromDomain(domain, server);

            using (var entry = new DirectoryEntry(ldapDomainString, username, password))
            {
                using (var search = new DirectorySearcher(entry))
                {
                    search.Filter = $"(&(objectClass=user)(objectCategory=user) (sAMAccountName={username}))";
                    var result = search.FindOne();
                    return Json(result.Properties, JsonRequestBehavior.AllowGet);
                }
            }
        }
        catch (Exception ex)
        {
            return Json(new { Error = ex.Message }, JsonRequestBehavior.AllowGet);
        }
    }

將域字符串轉換為LDAP友好字符串的Helper方法:

    private string LdapStringFromDomain(string domain, string server)
    {
        var ldapString = $"LDAP://{server}/";
        var domainArr = domain.Split('.');

        for (int i = 0; i < domainArr.Length; i++)
        {
            ldapString += $"DC={domainArr[i]}";

            if (i != domainArr.Length - 1)
                ldapString += ",";
        }
        return ldapString;
    }

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM