簡體   English   中英

重新連接后的Active Directory身份驗證問題-C#

[英]Active Directory authentication issue after reconnect - C#

在@serialhobbyist的請求上添加更多信息

大家好。 我們(=我和我的同事)使用System.DirectoryServices.AccountManagement中的PrincipalContext來檢索一些身份驗證信息(確保用戶屬於某個組,等等)。

重要提示:我們的客戶端是作為LocalSystem運行的服務。 當我們在正常流程中運行或將服務更改為以特定用戶身份運行時,不會發生這種情況

這是一個代碼示例:

using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domain))
{
    Principal p = Principal.FindByIdentity(ctx,IdentityType.Sid, sid);
    ...
}

通常情況下一切正常(得到答復)。 每隔幾個小時(觸發器不清晰)一次,或者在網絡斷開並重新連接之后(當我們的AD客戶端斷開連接,通過網絡電纜斷開連接或VM適配器禁用等)時,我們將收到此異常:

System.Runtime.InteropServices.COMException (0x80072020): An operations error occurred.

at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
at System.DirectoryServices.DirectoryEntry.Bind()
at System.DirectoryServices.DirectoryEntry.get_AdsObject()
at System.DirectoryServices.PropertyValueCollection.PopulateList()
at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer()
at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()
at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
at System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()
at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable``1 identityType, String identityValue, DateTime refDate)
at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, IdentityType identityType, String identityValue)
at System.DirectoryServices.AccountManagement.Principal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue)

搜索異常(0x80072020),我看到它轉換為LDAP_OPERATIONS_ERROR (實際上在這里用作代碼值轉換示例:)),我們使用LDAP_OPERATIONS_ERROR檢查了流量,並在發送任何LDAP查詢之前拋出了異常。
重新啟動過程后,一切恢復正常(可以成功驗證,沒有異常)。 有人可以闡明這件事嗎? 有什么想法可以實現在過程終止時完成的等效清理嗎? 謝謝!

更新:我們已經找到解決方法,將在下面提供答案。 但是,我們寧願找到一個更簡單的解決方案。

我們在msdn上找到了一種解決方法,方法是使用DirectoryEntry + DirectorySearcher對象直接查詢LDAP。 這需要一些相當麻煩的解析(考慮這不是我們的主要專長),而不是通過現有對象進行工作。 使用這種方法,但是不會遇到上述情況。 如上所述,我們將贊賞使用現有對象的更好解決方案。

暫無
暫無

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

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