Реализация 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