Проверка кода авторизации (OpenID Connect 1.0)

Я пытаюсь выполнить следующие шаги для проверки авторизационного кода:

Чтобы проверить авторизационный код, выпущенный с конечной точки авторизации с помощью идентификатора идентификатора, клиенту СЛЕДУЕТ делать следующее:

1-) Хэш октетов представления ASCII кода с алгоритмом хеширования, указанным в JWA [JWA] для параметра заголовка alg заголовка JOSE-маркера ID-токена. Например, если alg является RS256, используемым алгоритмом хэширования является SHA-256.

2-) Возьмите самую левую часть хэша, а base64url закодируйте ее.

3-) Значение c_hash в токене идентификатора ДОЛЖНО соответствовать значению, полученному на предыдущем шаге, если c_hash присутствует в токене идентификатора.

У меня есть этот КОД, когда я впервые запрашиваю конечную точку авторизации, чтобы попробовать аутентифицировать пользователя из WebForms Client:

code=0655d48df75629d9fdbd5a060141bf66ca04418a0e762a6a5e6382c2748753af

У меня тоже есть C_HASH, что я могу получить от id_token:

"c_hash": "QadHSCSim4aHM8q1F1F6Bg"

Я пытаюсь проверить CODE следующим образом:

Private Shared Function IsValidAuthorizationCode(authorizationCode As String, stringIdTokenPayload As String) As Boolean
    Dim serializer As New JavaScriptSerializer()
    Dim BytesPayload As Byte() = Decode(stringIdTokenPayload)
    Dim stringPayload As String = System.Text.ASCIIEncoding.ASCII.GetString(BytesPayload)
    Dim deserialized_payload = serializer.Deserialize(Of Dictionary(Of String, Object))(stringPayload)
    Dim c_hash = deserialized_payload.Item("c_hash").ToString()

    Dim mySHA256 = SHA256Managed.Create()
    Dim authorizationCodeOCTETS = Decode(authorizationCode)
    Dim elemntsToIterate = mySHA256.ComputeHash(authorizationCodeOCTETS)
    Dim length = elemntsToIterate.Length
    Dim hashedCode(length/2 - 1) As Byte

    Dim count = -1
    For Each element As Byte in elemntsToIterate
        count += 1
        If count > 15 Then
            hashedCode(count - 16) = element
        End If
    Next

    Dim hashedCodeLikeString = Convert.ToBase64String(hashedCode)
    If hashedCodeLikeString.Length <> hashedCode.Length
        Return False
    Dim result As Boolean = True
    For value As Integer = 0 To hashedCodeLikeString.Length
        If (hashedCodeLikeString(value) <> hashedCode(value)) Then
            result = False
            Exit For
        End If
    Next
    Return result
End Function

Но я не ожидаю результата. Мне нужно получить ИСТИННОЕ значение, но я получаю ЛОЖЬ. Я думаю, что я делаю что-то неправильно, но я не понимаю, что это такое. Любая помощь, пожалуйста?

Заранее большое спасибо.

vb.net,identityserver4,oidc,

0

Ответов: 1


1 принят

Я не знаю этого языка программирования, но вот код от OidcClient

https://github.com/IdentityModel/IdentityModel.OidcClient2

    public bool ValidateHash(string data, string hashedData, string signatureAlgorithm)
    {
        var hashAlgorithm = GetMatchingHashAlgorithm(signatureAlgorithm);

        using (hashAlgorithm)
        {
            var hash = hashAlgorithm.ComputeHash(Encoding.ASCII.GetBytes(data));

            byte[] leftPart = new byte[hashAlgorithm.HashSize / 16];
            Array.Copy(hash, leftPart, hashAlgorithm.HashSize / 16);

            var leftPartB64 = Base64Url.Encode(leftPart);
            var match = leftPartB64.Equals(hashedData);

            if (!match)
            {
                _logger.LogError($"data ({leftPartB64}) does not match hash from token ({hashedData})");
            }

            return match;
        }
    }

    public HashAlgorithm GetMatchingHashAlgorithm(string signatureAlgorithm)
    {
        var signingAlgorithmBits = int.Parse(signatureAlgorithm.Substring(signatureAlgorithm.Length - 3));

        switch (signingAlgorithmBits)
        {
            case 256:
                _logger.LogDebug("SHA256");
                return SHA256.Create();
            case 384:
                _logger.LogDebug("SHA384");
                return SHA384.Create();
            case 512:
                _logger.LogDebug("SHA512");
                return SHA512.Create();
            default:
                return null;
        }
    }
vb.net, identityserver4, РСИН,
Похожие вопросы
Яндекс.Метрика