Клиентское приложение IdentityServer4: ArgumentNullException: IDX10000: параметр 'hashAlgorithm' не может быть пустым или пустым объектом - PullRequest
0 голосов
/ 05 марта 2020

Реализация IdToken token потока типа ответа для MVC 5 клиента, с ошибкой, говорящей о том, что ArgumentNullException: IDX10000: The parameter 'hashAlgorithm' cannot be a 'null' or an empty object.

, похоже, сбой, Alg получено как hmac, и Microsoft IdentityModel ищет SHA256. При обнаружении ошибки трассировки стека в

   at Microsoft.IdentityModel.Tokens.CryptoProviderFactory.ReleaseHashAlgorithm(HashAlgorithm hashAlgorithm) in C:\agent2\_work\56\s\src\Microsoft.IdentityModel.Tokens\CryptoProviderFactory.cs:line 491
   at Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolValidator.ValidateHash(String expectedValue, String hashItem, String algorithm) in C:\agent2\_work\56\s\src\Microsoft.IdentityModel.Protocols.OpenIdConnect\OpenIdConnectProtocolValidator.cs:line 489
   at Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolValidator.ValidateAtHash(OpenIdConnectProtocolValidationContext validationContext) in C:\agent2\_work\56\s\src\Microsoft.IdentityModel.Protocols.OpenIdConnect\OpenIdConnectProtocolValidator.cs:line 590
   at Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolValidator.ValidateAuthenticationResponse(OpenIdConnectProtocolValidationContext validationContext) in C:\agent2\_work\56\s\src\Microsoft.IdentityModel.Protocols.OpenIdConnect\OpenIdConnectProtocolValidator.cs:line 265

MVC 5 в качестве конфигурации аутентификации клиента Identityserver4:

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
                {
        ..   
        ProtocolValidator = new JweProtocolValidator
                        {
                            RequireStateValidation = false,
                            NonceLifetime = TimeSpan.FromMinutes(20)
                        },
        Notification:
             SecurityTokenValidated = n =>
                                    {
                                        var id = n.AuthenticationTicket.Identity;
                                        id.AddClaim(new System.Security.Claims.Claim("access_token", n.ProtocolMessage.AccessToken));
                                        n.AuthenticationTicket = new Microsoft.Owin.Security.AuthenticationTicket(id, n.AuthenticationTicket.Properties);
                                        return Task.FromResult(0);
                                    },
        ..
    }

валидатор:

public class JweProtocolValidator : OpenIdConnectProtocolValidator
{
    protected override void ValidateIdToken(OpenIdConnectProtocolValidationContext validationContext)
    {
        if (validationContext.ValidatedIdToken.InnerToken != null)
            validationContext.ValidatedIdToken = validationContext.ValidatedIdToken.InnerToken;

        base.ValidateIdToken(validationContext);
    }

    public override void ValidateTokenResponse(OpenIdConnectProtocolValidationContext validationContext)
    {
        if (validationContext.ValidatedIdToken.InnerToken != null)
            validationContext.ValidatedIdToken = validationContext.ValidatedIdToken.InnerToken;

        base.ValidateTokenResponse(validationContext);
    }

    public override void ValidateUserInfoResponse(OpenIdConnectProtocolValidationContext validationContext)
    {
        if (validationContext.ValidatedIdToken.InnerToken != null)
            validationContext.ValidatedIdToken = validationContext.ValidatedIdToken.InnerToken;

        base.ValidateUserInfoResponse(validationContext);
    }
}

Примечание: попытался выполнить артикул https://www.scottbrady91.com/Identity-Server/Encrypting-Identity-Tokens-in-IdentityServer4

...