Аутентификация внешней базы данных в Moodle с использованием базы данных ms sql, созданной с использованием идентификатора .net
Я застрял с одной проблемой и ищу помощи. У меня есть приложение.net, и у него есть база данных в MS SQL, в которой есть таблица AspNetUsers, которая содержит имя, адрес электронной почты, PasswordHash, SecurityStamp и некоторые другие поля. Мне удалось успешно подключить эту базу данных к Moodle для аутентификации с помощью внешней БД.
Но он по-прежнему не входит в систему с использованием этих пользователей. Поля PasswordHash и SecurityStamp создаются с использованием идентификатора.net. Я пробовал sha1 и md5(маловероятно, но все же пробовал) и PasswordHash в качестве поля пароля, но он не работает. Я думаю, что SecurityStamp тоже должен быть задействован, но не знаю, где и как его добавить. Я также смог преобразовать код проверки хэша пароля на C# в PHP и попытался поместить его в файл htdocs\moodle\auth\db\auth.php в moodle, но не повезло, и сайт перестал работать. Я думаю, что этот код не выполняется, поскольку я попытался поместить оператор echo и выйти при аутентификации sha1, но он не дошел до него, поскольку тестовое сообщение не отображалось. Несколько других эхо-сообщений, которые я добавил вверху, отображались из того же файла PHP.
вот PHP-код, который может помочь проверить PasswordHash, но не знаю, как и где добавить это в moodle..
<?php
declare(strict_types = 1);
namespace SqlCollaborative\AlwaysEncryptedSample\Security;
use RuntimeException;
class AspNetIdentity
{
const PBKDF2_ITER_COUNT = 1000; // default for Rfc2898DeriveBytes
const PBKDF2_SUBKEY_LENGTH = 256/8; // 256 bits
const SALT_SIZE = 128/8; // 128 bits
private function generateRandomSalt() : string
{
return random_bytes(self::SALT_SIZE);
}
public function getPasswordSalt(string $hashedPassword) : string
{
$hashedPasswordByteString = base64_decode($hashedPassword);
$expectedHashLength = 1 + self::SALT_SIZE + self::PBKDF2_SUBKEY_LENGTH;
$actualHashLength = strlen($hashedPasswordByteString);
$header = substr($hashedPasswordByteString, 0, 1);
if ($header != "\0"){
throw new RuntimeException("Incorrect header [ $header ]");
}
if ($actualHashLength != $expectedHashLength)
{
throw new RuntimeException (
"Salted hash is wrong length [ expected = {$expectedHashLength}, actual = {$actualHashLength} ]"
);
}
return substr($hashedPasswordByteString, 1, self::SALT_SIZE);
}
/**
* Creates a PBKDF2 (AKA Rfc2898) hash from a plaintext password.
* @param string $password A plaintext password
* @param string|null $salt Optionally specify the hash. This should only be used to verify existin passwords.
* @return string The base64 encoded password hash
*/
public function hashPassword(string $password, string $salt = null) : string
{
$salt = $salt ?? $this->generateRandomSalt();
$subkey = hash_pbkdf2(
'sha1', // The SHA1 exploit google discovered is irrevelevant to HMAC_SHA1
$password,
$salt,
self::PBKDF2_ITER_COUNT,
self::PBKDF2_SUBKEY_LENGTH,
true
);
return base64_encode("\0" . $salt . $subkey);
}
/**
* verifies a plaintext password matches its hash.
* @param string $hashedPassword must be of the format of HashWithPassword (salt + Hash(salt+input)
* @param string $password the plain text version of the password
* @return bool true if the password matches false if it does not.
*/
public function verifyHashedPassword(string $hashedPassword, string $password) : bool
{
try {
$salt = $this->getPasswordSalt($hashedPassword);
}
catch (RuntimeException $ex) {
trigger_error($ex->getMessage());
return false;
}
$actualHashedPassword = $this->hashPassword($password, $salt);
return ($actualHashedPassword === $hashedPassword);
}
}
Любая помощь будет высоко ценится.