Pregunta

Estoy conectando a un servidor de Microsoft Active Directory en una DMZ de mi aplicación .NET (VB .net asp.net 4.0). Necesito crear un nuevo "inetorgperson" en una unidad organizativa llamada "SingleCustomerAccount".

he tenido que utilizar el espacio de nombres System.DirectoryServices.Protocols por todo el trabajo, ya que las clases de ADSI (System.DirectoryServices de espacio de nombres) no funcionaría a través de la zona desmilitarizada correctamente.

De todos modos ha sido bien conectar a Active Directory en Windows Server 2003 R2 trabajando; Sin embargo estamos pruebas en Active Directory que se ejecuta en Windows Server 2008 R2 (2008R2 en modo nativo de bosque y dominio) con el fin de actualizar.

Mi código existente para crear un usuario no funciona.

System.DirectoryServices.Protocols.DirectoryOperationException: The server cannot handle directory requests.
   at System.DirectoryServices.Protocols.LdapConnection.ConstructResponse(Int32 messageId, LdapOperation operation, ResultAll resultType, TimeSpan requestTimeOut, Boolean exceptionOnTimeOut)
   at System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request, TimeSpan requestTimeout)
   at System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request)
   at Salford.LDAP.LDAPUser.SaveNewToDirectory(String UsersFirstPassword) in C:\Projects\SCA\App_Code\SCA\LDAPUser.vb:line 1059
   at SCA.Web.Service.CitizenService.CreateNewAccount(String Username, String Title, String FirstName, String Surname, String Street, String City, String County, String Postcode, String EmailAddress, String HomeTel, String MobileTel, String UPRN, String SpinID, Int16 AccountLevel) in C:\Projects\SCA\App_Code\CitizenService.vb:line 255

He encontrado que cuando se quita el trozo de código que añade el atributo de contraseña, se crea el usuario, pero sólo sin una contraseña. Por lo que el código de la culpa es donde estoy añadiendo la contraseña. Pero lo que ha cambiado entre 2003 y 2008, lo que habría dejado que funcione?

Aquí está mi código.

Using ldapConn As New LdapConnection(New LdapDirectoryIdentifier(LDAPServerAddress), credential)
 ldapConn.SessionOptions.ProtocolVersion = 3
 ldapConn.SessionOptions.Signing = Not _UseSecureConnection
 ldapConn.SessionOptions.Sealing = Not _UseSecureConnection
 ldapConn.SessionOptions.SecureSocketLayer = _UseSecureConnection
 If _UseSecureConnection Then
  ldapConn.SessionOptions.VerifyServerCertificate = New VerifyServerCertificateCallback(AddressOf ServerCallback)
 End If
 ldapConn.AuthType = AuthType.Negotiate

 ldapConn.Bind()

 Dim DistinguishedName As String = String.Format("CN={0},OU={1},{2}", Me.AccountName, Me.OrgUnit, Me.DCSuffix)

 ' Save this distinguished name to the local object; so that the group memberships addition works in a minute.
 Me._DistinguishedName = DistinguishedName

 Dim addRequest As New AddRequest(DistinguishedName, Me.LDAPUserObjectType)

 '' Add an AccountName attribute
 addRequest.Attributes.Add(New DirectoryAttribute(GetLDAPSchemaMapping(LDAPUserProperties.AccountName), AccountName))

 '' Look in any derived classes, if they want any attributes adding as part of this save operation.

 '' Hint: Derived classes will override the "GetDirectoryAttributesForAddNewRequest" function and return a list of anything they want adding
 '' to the AD at the time of creation.
 If Not GetDirectoryAttributesForAddNewRequest() Is Nothing Then
  For Each kvp As KeyValuePair(Of String, String) In GetDirectoryAttributesForAddNewRequest()
   addRequest.Attributes.Add(New DirectoryAttribute(kvp.Key, kvp.Value))
  Next
 End If

 '' Hash up the password into a Unicode byte array and send this as the requried initial password.
 addRequest.Attributes.Add(New DirectoryAttribute("unicodePwd", GetPasswordData(UsersFirstPassword)))

 ' Execute the request on the directory server.
 Dim addResponse As DirectoryResponse = ldapConn.SendRequest(addRequest)

 ' Need to return the GUID, need to search against the ldap server:
 Dim request As New SearchRequest(String.Format("OU={0},{1}", Me.OrgUnit, Me.DCSuffix), "(&(objectCategory=" & Me.LDAPUserObjectType & ")(sAMAccountName=" & Me.AccountName & "))", System.DirectoryServices.Protocols.SearchScope.Subtree)
 Dim searchResponse As SearchResponse = DirectCast(ldapConn.SendRequest(request), SearchResponse)

 returnedGuid = DirectCast(searchResponse.Entries(0).Attributes("objectGuid").Item(0), Byte())

 ' Set up the search request object so we can do searches now based on this new user:
 Dim rq As SearchRequest = BuildLdapSearchRequest("sAMAccountName", Me.AccountName)

 ' ** Send the query to the LDAP server, and save the response into the private _SearchResponse object **
 _SearchResponse = DirectCast(ldapConn.SendRequest(rq), SearchResponse)
End Using

_useSecureConnection es falsa para esta llamada - el enlace funciona bien. Como ya he dicho, cuando comento a cabo esta línea, funciona:

addRequest.Attributes.Add(New DirectoryAttribute("unicodePwd", GetPasswordData(UsersFirstPassword)))

El método GetPasswordData está por debajo para la integridad.

''' <summary>
''' Returns a unicode-encoded byte array based on the incoming password string.
''' </summary>
''' <param name="password">The password to turn into a byte array</param>
Public Function GetPasswordData(ByVal password As String) As Byte()
 Dim formattedPassword As String
 formattedPassword = String.Format("""{0}""", password)
 Return Encoding.Unicode.GetBytes(formattedPassword)
End Function

Agradezco cualquier idea ...

Saludos bgs264

¿Fue útil?

Solución 2

Esto fue corregido por una combinación del uso de LDAPS en lugar de LDAP; la relajación de la política de contraseñas; hacer una reconstrucción completa de la solicitud; borrar la memoria caché del navegador y reiniciar todos los servidores.

Otros consejos

¿Es posible que las políticas de contraseñas son diferentes para los dos servidores? O que hay alguna otra diferencia política?

Una forma de cheque podría ser utilizar la herramienta ldp.exe y ver si se puede hacer las mismas operaciones con la exacta misma contraseña con él. Aquí 'sa enlace que describe el cambio de la contraseña utilizando esa herramienta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top