Использовать членство ASP.NET в PHP - PullRequest
5 голосов
/ 23 февраля 2012

Мне нужно пройти аутентификацию по таблице членства ASP.NET в php.API членства настроен на использование хэшированного пароля.

Может ли кто-нибудь любезно дать мне php, чтобы хэшировать пароль, полученный из формы входа, и сравнить его с полем sql?пароль, который я передаю, правильный, но он не хэшируется.

private function Auth( $username, $password )
{
    // Hashed password in db
    $hash = $this->parent->_memberData['conv_password'];

    // password passed from form
    $bytes = mb_convert_encoding($password, 'UTF-7');       

    // Salt from db
    $salt = base64_decode($this->parent->_memberData['misc']);

    // hash password from form with salt
    $hashedpassword = base64_encode(sha1($salt . $bytes, true));

    // Test em out
    if ($hashedpassword == $hash)
    {
        $this->return_code = "SUCCESS";
        return true;
    }
    else
    {
        $this->return_code = "WRONG_AUTH";
        return false;
    }
}

ОБНОВЛЕНИЕ:

Я пробовал разные кодировки с одинаковыми результатами.UTF-7, UTF-8 и UTF-16.

ОБНОВЛЕНИЕ: Я боролся с этим уже неделю.Награда приближается ...

Вот код .net в форме модульного теста.Модульный тест работает и значения прямо из базы данных.Как правильно переводить этот код в php?

public void EncodePassword()
        {
        string expected = "aP/mqBu3VkX+rIna42ramuosS3s=";
        string salt = "urIaGX0zd/oBRMDZjc1CKw==";
        string pass = "Comeonman";

        byte[] bytes = Encoding.Unicode.GetBytes(pass);
        byte[] numArray = Convert.FromBase64String(salt);
        byte[] numArray1 = new byte[(int)numArray.Length + (int)bytes.Length];
        byte[] numArray2 = null;
        Buffer.BlockCopy(numArray, 0, numArray1, 0, (int)numArray.Length);
        Buffer.BlockCopy(bytes, 0, numArray1, (int)numArray.Length, (int)bytes.Length);

            HashAlgorithm hashAlgorithm = HashAlgorithm.Create("SHA1");
            if (hashAlgorithm != null)
            {
                numArray2 = hashAlgorithm.ComputeHash(numArray1);
            }

        Assert.AreEqual(Convert.ToBase64String(numArray2), expected);
    }

Ответы [ 4 ]

6 голосов
/ 03 марта 2012
$password = 'Comeonman';
$salt = base64_decode('urIaGX0zd/oBRMDZjc1CKw=='); 
$utf16Password = mb_convert_encoding($password, 'UTF-16LE', 'UTF-8');
echo base64_encode(sha1($salt.$utf16Password, true));
3 голосов
/ 05 марта 2012

Я бы предложил создать веб-сервис в .NET, который обеспечит доступ к ведению журналов или любой другой функциональности .NET к вашему PHP-коду.

Тогда вы можете просто отправить запрос XML внутри и посмотреть, что вы получите.

Я полагаю, что есть некоторые надстройки PHP, которые могут легко вызывать веб-сервисы .NET.

0 голосов
/ 07 марта 2012

Вам не нужен machineKey, а также для декодирования / кодирования?

0 голосов
/ 23 февраля 2012

Пароль определенно закодирован как UTF-16, а соль определенно закодирована в base-64, но я не думаю, что результат хеширования закодирован в base-64.

...