簡體   English   中英

使用Windows身份驗證定義AD服務器

[英]Using Windows Authentication, define AD-Server

我們正在開發一個網絡應用程序,使我們可以編輯數據庫中的數據。 由於應該可以從外部訪問此應用程序,因此我們決定將其放在我們的DMZ服務器之一上。 為了對所有訪問此服務的用戶進行集中控制,我們決定使用Windows身份驗證。 但是,由於DMZ服務器不是我們本地LAN中Active Directory的成員,所以這還行不通(獲取“ 401-未經授權:訪問由於憑據無效而被拒絕。”)。

我試圖指定LDAP-ConnectionString,如此處所述ASP.NET MVC:如何為LDAP身份驗證設置web.config? 但這行不通。 我猜想,此配置並非設計用於Windows身份驗證( <authentication mode="Windows"/> )。 即使我在本地計算機上對其進行了測試並輸入了錯誤的憑據,它也會對我進行身份驗證。 所以我的猜測是,該配置已被完全忽略。

<connectionStrings>
    <add name="ADConnectionString" connectionString="LDAP://<IP of AD-Server>/DC=<DomainName>"/>
</connectionStrings>
<system.web>
[...]
<authentication mode="Windows"/>
<authorization>
  <deny users="?" />
</authorization>
<membership defaultProvider="ADMembershipProvider" >
  <providers>
    <clear/>
    <add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider" 
         connectionStringName="ADConnectionString"
         connectionUsername="<Domain>\<LDAP-Reader-User>"
         connectionPassword="<LDAP-Reader-Password>"/>
  </providers>
</membership>

為確保問題不在於LDAP通信,我進行了LDAP-Query-Test。 DMZ服務器實際上能夠發送LDAP查詢。 我測試了以下內容,並獲得了肯定的結果(通過提供錯誤的密碼獲得了否定的結果)

public bool TestPrincipalContext()
{
    PrincipalContext c = new PrincipalContext(ContextType.Domain, "<IP of AD-Server>", "<LDAP-Reader-User>", "<LDAP-Reader-Password>");
    return c.ValidateCredentials(Request.Form["username"], Request.Form["password"]);
}

題:

我正在尋找的是一個配置或一個“ custom-security-provider”,可以在其中指定LDAP服務器並使用Windows身份驗證的所有內置功能。 這可能嗎? 我該怎么做?

免責聲明

這可能對所有人沒有幫助,可能不是最干凈的方法,但這對我有所幫助。

為了解釋為什么我選擇這種方法,在以下情況下:

  • 基本上,我們只想通過檢查某個組的成員身份(使用[Authorize]User.IsInRole )來檢查給定用戶是否有權訪問某些元素。 而且我們要在一個地方(AD)管理所有用戶

  • 我們的時限很短,這不允許我們花費太多時間來尋找最佳方法。

  • 我們已經知道我們將使用什么AD服務器以及如何對待將有權訪問上述服務的用戶。 此外,用戶無法自行注冊,因此總體上我們可以控制誰有權訪問我們的資源。

  • 我們希望將運行服務的數量保持在盡可能低的水平,並且由於ADFS對我們來說是一項額外的服務,因此我們在尋找替代方案。

  • 由於“安全管理”依賴於FormsAuthentication(Cookie加密),因此我們認為它是安全的。 另外,我們創建了一個服務用戶,該用戶僅具有讀取LDAP的權限。

如果您有安全問題,更好的解決方案或僅是建議,請隨時添加評論/答案。

快速概述

我最終創建了一個自定義“ SecurityProvider”。 我受到https://support.microsoft.com/zh-CN/help/316748/how-to-authenticate-against-the-active-directory-by-using-forms-authen的啟發,該文檔描述了使用FormsAuthentication和.aspx。

基本上,它在Global.asax的Application_AuthenticateRequest -Method中設置用戶( HttpContext.User )。 這是通過使用解密的Cookie來完成的,該Cookie在PrincipalContextFormsAuthentication的幫助下在登錄中設置。

海關負責人

由於UserPrincipal不實現IPrincipal ,因此我制作了一個名為CustomPrincipal的包裝,該包裝實現了IPrincipal並將UserPrincipal作為屬性。 這樣,我可以從PrincipalContext檢索UserPrincipal ,並將其用作User( HttpContext.User )。

Application_AuthenticateRequest

在這里,我通過檢查cookie來檢查用戶是否登錄,如果是,則解密cookie以獲取用戶名,創建所需的CustomPrincipal -object並將其設置為User。

登錄

在登錄時,它將使用給定的用戶名和密碼,並使用PrincipalContext來檢查給定的憑據是否有效( PrincipalContext.ValidateCredentials(username, password) )。 如果是,則生成包含用戶名的加密cookie。

登出

注銷僅使“ Auth” -Cookie過期。 就那么簡單...

暫無
暫無

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

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