validar usuario single password obtener datos crear conectar con active c# active-directory

c# - usuario - El acceso a SetPassword de LDAP está denegado



single sign on c# active directory (1)

Aquí está el ejemplo:

PrincipalContext pr = new PrincipalContext(ContextType.Domain, "corp.local", "OU=" + OU + ",OU=Users,dc=corp,dc=local", username, password); UserPrincipal us = new UserPrincipal(pr);

Para cambiar la contraseña

user.SetPassword("setPassword");

Si desea que el usuario cambie la contraseña en el siguiente inicio de sesión, puede usar de esta manera.

user.ExpirePasswordNow();

Aquí está su código completo: -

public static Boolean ResetPassword(string username, string password, string DomainId, string setpassword, Boolean UnlockAccount,Boolean NextLogon) { PrincipalContext pr = new PrincipalContext(ContextType.Domain, "corp.local", "dc=corp,dc=local", username, password); UserPrincipal user = UserPrincipal.FindByIdentity(pr, DomainId); Boolean flag = false; if (user != null && user.Enabled == true) { if (UnlockAccount) { user.UnlockAccount(); } user.SetPassword(setpassword); if (NextLogon) { user.ExpirePasswordNow(); } user.Save(); flag = true; } else { flag = false; } user.Dispose(); pr.Dispose(); return flag; }

Encontré un buen artículo aquí, si quieres usarlo en tu camino, mira aquí,

http://www.primaryobjects.com/cms/article66.aspx

el siguiente código estuvo funcionando durante 3 meses sin ningún problema. Desde hoy recibo el siguiente error; "La excepción ha sido lanzada por el objetivo de una invocación" y la excepción interna; "Acceso denegado. (Excepción de HRESULT: 0x80070005 (E_ACCESSDENIED)"

La función de autenticación funciona. Aquí están mis funciones;

public bool Authenticate(string strUserName, string strPassword) { bool authenticated = false; using ( var entry = new DirectoryEntry("LDAP://myldapserver", strUserName + "@domain", strPassword, AuthenticationTypes.Secure)) { try { object nativeObject = entry.NativeObject; authenticated = true; } catch (DirectoryServicesCOMException ex) { return false; } } return authenticated; }

Y el Método ChangePassword;

public bool ChangePassword(string strUserName, string strOldPassword, string strNewPassword) { const long ADS_OPTION_PASSWORD_PORTNUMBER = 6; const long ADS_OPTION_PASSWORD_METHOD = 7; const int ADS_PASSWORD_ENCODE_REQUIRE_SSL = 0; const int ADS_PASSWORD_ENCODE_CLEAR = 1; string strPort = "636"; int intPort; intPort = Int32.Parse(strPort); try { string strUserString = "domain" + @"/" + strUserName.Trim(); var entry = new DirectoryEntry("LDAP://myldapserver", strUserString, strOldPassword, AuthenticationTypes.Secure); var search = new DirectorySearcher(entry); string strFilter = "(SAMAccountName=" + strUserName + ")"; search.Filter = strFilter; SearchResult result = search.FindOne(); DirectoryEntry user = result.GetDirectoryEntry(); user.Invoke("SetOption", new object[] { ADS_OPTION_PASSWORD_PORTNUMBER, intPort }); user.Invoke("SetOption", new object[] { ADS_OPTION_PASSWORD_METHOD, ADS_PASSWORD_ENCODE_CLEAR }); **user.Invoke("SetPassword", new object[] { strNewPassword });** user.CommitChanges(); user.Close(); } catch (Exception exception) { string msg = exception.InnerException.Message; return false; } return true; }

Lanza la expceción cuando invoco la propiedad SetPassword. Cualquier ayuda sería muy apreciada.