Passwort setzen via LDAP mit PHP - oder auch anders?

29/10/2008 - 16:46 von Daniel Hohenberger | Report spam
Hallo zusammen,

ich habe hier einen Windows Server 2008 mit installiertem Active Directory, das
ich verwende, um Nutzer diverser Dienste, die auch auf diesem Rechner laufen, zu
authentifizieren - z.B. DokuWiki, Subversion, etc.
Die Nutzer sollten sich also eigentlich nie an dem Windowsrechner direkt
anmelden, ich möchte ihnen aber die Möglichkeit geben, ihr Passwort zu àndern.
Dazu habe ich eine PHP-Lösung ergoogelt (s.u.). Ich dachte eigentlich, ich hàtte
alle Hürden umschifft, nachdem ich auch die Active Directory Zertifikatsdienste
installiert habe, ein eigenes Zertifikat erstellt und es damit auch geschafft
per ldaps auf das Active Directory zuzugreifen. Zumindest Search und Bind gehen.
Doch beim Versuch das Passwort zu àndern, kriege ich vom Server nur ein "Server
is unwilling to perform". Wenn ich das Debugging für die LDAP-Schnittstelle
aktiviere findet sich folgender Fehler in der Ereignisanzeige: 0000001F: SvcErr:
DSID-031A11E5, problem 5003 (WILL_NOT_PERFORM), data 0

Und hier finde ich auch mit Google nicht mehr weiter und hoffe, dass mir in
dieser Gruppe jemand einen Tip geben kann. Gerne auch einen Tip, wie ich das
Ändern eines Passwortes anders ermöglichen kann, wenn die Nutzer nur über ein
Webinterface zugreifen sollen und ich mit einem Apache 2.2 arbeite.

Schönen Dank schon mal,
Daniel

Hier mein (anonymisierter) Sourcecode:

<?php
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Change Password</title>
</head>
<body>
<form action="change-password.php" method="post">
<table>
<tr>
<td>User name:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>Old password:</td>
<td><input type="password" name="oldpassword"></td>
</tr>
<tr>
<td>New password:</td>
<td><input type="password" name="newpassword"></td>
</tr>
<tr>
<td>Repeat new password:</td>
<td><input type="password" name="newpassword2"></td>
</tr>
</table>
<br />
<input type="submit" value="Change password" />
</form>
<?php
if ('POST' == $_SERVER['REQUEST_METHOD']) {
if (!isset($_POST['username'], $_POST['oldpassword'],
$_POST['newpassword'], $_POST['newpassword2'])){
print "<p class='error'>Please fill all fields.</p>";
}else{
$username = htmlspecialchars($_POST['username']);
$oldpassword = htmlspecialchars($_POST['oldpassword']);
$newpassword = htmlspecialchars($_POST['newpassword']);
$newpassword2 = htmlspecialchars($_POST['newpassword2']);

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
$ldapconn = ldap_connect('ldaps://127.0.0.1', 636);
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
$ldapuser="ldapuser";
$ldappwd="*****";

// search for user
ldap_bind($ldapconn, "CN=$ldapuser,CN=Users,DC=my,DC=company,DC=com",
$ldappwd);

$res_id = ldap_search( $ldapconn, "CN=Users,DC=my,DC=company,DC=com",
"sAMAccountName=$username");
if ($res_id) {
$entry_id = ldap_first_entry($ldapconn, $res_id);
if($entry_id){
$user_dn = ldap_get_dn($ldapconn, $entry_id);
print($user_dn);
if ($user_dn) {
$ldapbind = ldap_bind($ldapconn, $user_dn, $oldpassword);
// check if the old password allows a successfull login
if($ldapbind) {
if(strcmp($newpassword, $newpassword2)==0){

// create the unicode password
$len = strlen($newpassword);
$newpassword = "\"" . $newpassword . "\"";
$newPass = "";
for ($i = 0; $i < $len; $i++){
$newPass .= "{$newpassword{$i}}\000";
}

//rebind as admin to change the password
ldap_bind($ldapconn,
"CN=$ldapuser,CN=Users,DC=my,DC=company,DC=com", $ldappwd);

$pwdarr = array('unicodePwd' => $newPass);
if(ldap_mod_replace ($ldapconn, $user_dn, $pwdarr)) {
print "<p class='success'>Change password succeded.</p>";
} else {
print "<p class='error'>Change password failed:<br
/>".ldap_error($ldapconn)."</p>";
}
}else{
print "<p class='error'>New password must be entered the same
way twice.</p>";
}
}else{
print "<p class='error'>Wrong user name or password.</p>";
}
} else {
print "<p class='error'>Couldn't load user data.</p>";
}
} else {
print "<p class='error'>Couldn't find user data.</p>";
}
} else {
print "<p class='error'>Username was not found.</p>";
}
print "<p class='error'>LDAP Error:<br />";
var_dump(ldap_error($ldapconn));
print "</p>";
@ldap_close($ldapconn);
}
}
?>
</body>
</html>
 

Lesen sie die antworten

#1 Thorsten Kampe
29/10/2008 - 17:08 | Warnen spam
* Daniel Hohenberger (Wed, 29 Oct 2008 16:46:40 +0100)
ich habe hier einen Windows Server 2008 mit installiertem Active Directory, das
ich verwende, um Nutzer diverser Dienste, die auch auf diesem Rechner laufen, zu
authentifizieren - z.B. DokuWiki, Subversion, etc.
Die Nutzer sollten sich also eigentlich nie an dem Windowsrechner direkt
anmelden, ich möchte ihnen aber die Möglichkeit geben, ihr Passwort zu àndern.
Dazu habe ich eine PHP-Lösung ergoogelt (s.u.). Ich dachte eigentlich, ich hàtte
alle Hürden umschifft, nachdem ich auch die Active Directory Zertifikatsdienste
installiert habe, ein eigenes Zertifikat erstellt und es damit auch geschafft
per ldaps auf das Active Directory zuzugreifen. Zumindest Search und Bind gehen.
Doch beim Versuch das Passwort zu àndern, kriege ich vom Server nur ein "Server
is unwilling to perform". Wenn ich das Debugging für die LDAP-Schnittstelle
aktiviere findet sich folgender Fehler in der Ereignisanzeige: 0000001F: SvcErr:
DSID-031A11E5, problem 5003 (WILL_NOT_PERFORM), data 0

Und hier finde ich auch mit Google nicht mehr weiter und hoffe, dass mir in
dieser Gruppe jemand einen Tip geben kann.



http://www.google.com/search?hl=en&...=off&q00001F%3A+SvcErr%
3A+problem+5003+WILL_NOT_PERFORM&btnG=Search

Ähnliche fragen