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

时间:2011-01-20 18:08:30

标签: vb.net authentication active-directory

目前,用户使用其AD(活动目录)凭据登录Web应用程序,该凭据根据AD进行验证。进入应用程序后,某些用户需要更新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()

1 个答案:

答案 0 :(得分:1)

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

由于假冒不能“双跳”,第二种情况会有额外的困难,即网络服务器也必须是域控制器,或者您必须设置一些额外的AD delegation权限您的域管理员可能不想提供的服务器。

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

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