Аутентификация внешней базы данных в 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);
    }
}

Любая помощь будет высоко ценится.

0 ответов

Другие вопросы по тегам