无需硬编码用户名/密码即可更新 Active Directory

Posted

技术标签:

【中文标题】无需硬编码用户名/密码即可更新 Active Directory【英文标题】:Update Active Directory without hardcoding username/password 【发布时间】:2011-01-20 18:08:29 【问题描述】:

目前,用户使用已针对 AD 进行验证的 AD(活动目录)凭据登录 Web 应用程序。一旦进入应用程序,某些用户将需要更新 AD。当我对用户名/密码进行硬编码时,我可以更新 AD,但是当我尝试强制对象使用登录凭据或者我没有指定用户名/密码时,它会引发错误。显然出于安全考虑,我不想对凭据进行硬编码。有解决办法吗?

错误 - System.DirectoryServices.DirectoryServicesCOMException:发生操作错误。

    Public Shared Sub SetProperty(ByVal de As DirectoryEntry, ByVal propName As String, ByVal propValue As String)
        If Not propValue Is Nothing Then
            If de.Properties.Contains(propName) Then
                de.Properties(propName)(0) = propValue
            Else
                de.Properties(propName).Add(propValue)
            End If
        End If
    End Sub

    Public Shared Function GetDirectoryEntry(ByVal path As String) As DirectoryEntry
        Dim de As New DirectoryEntry()
        de.Path = path
        de.Username = "<username>"
        de.Password = "<password>"
        'Not setting the username or password or setting both to Nothing throws the error
        de.AuthenticationType = AuthenticationTypes.Secure
        Return de
    End Function

    Dim de As DirectoryEntry = GetDirectoryEntry("<path>")
    Dim searcher As DirectorySearcher = New DirectorySearcher(de)
    searcher.Filter = "(&(objectCategory=person)(objectClass=user)(cn=" & fullName & "))"
    searcher.SearchScope = SearchScope.SubTree
    Dim result As SearchResult = searcher.FindOne()

    If Not result Is Nothing Then
        Dim deResult As New DirectoryEntry(result.Path)
        SetProperty(deResult, "accountExpires", toAccountExpirationDate)
        deResult.CommitChanges()
        deResult.Close()
    End If

    de.Close()

【问题讨论】:

这是在 winforms 还是 asp.net 中? 是asp.net,我更新一下标签。 【参考方案1】:

为了在执行操作之前不必指定任何凭据,运行 IIS 的用户需要具有 AD 编辑权限(默认情况下肯定没有),或者您需要设置 Impersonation 并使用 Windows身份验证,以便它以查看页面的用户身份运行。

第二种情况有一个额外的困难,因为模拟无法“双跳”,即网络服务器也必须是域控制器,或者您必须在服务器上设置一些额外的AD delegation 权限您的域管理员可能不想给您。

在这种情况下,您的问题的解决方案是将运行您的应用程序的用户帐户更改为已经拥有所需权限的用户帐户。这样做的危险在于,任何安全漏洞都会赋予攻击者同样的权限。

或者,您可以加密一些凭据并解密以使用它们,这比硬编码要好一些。我想让用户手动提供凭据,然后以与您当前使用硬编码的方式相同的方式使用它们也可以。

【讨论】:

以上是关于无需硬编码用户名/密码即可更新 Active Directory的主要内容,如果未能解决你的问题,请参考以下文章

无需密码即可更新“用户”属性

Ruby on Rails 无需密码即可更新用户属性

无需硬编码访问密钥即可从 android 应用程序访问 AWS S3

密码硬编码(Password Management: Hardcoded Password)

为啥在php中硬编码用户名密码安全威胁?

在 IOS 中使用 QuickBlox 视频聊天,无需登录或密码