Как вручную создать токен OID C, подписанный ключом publi c? - PullRequest
0 голосов
/ 22 апреля 2020

В моем ASP. NET Core Web API я вручную генерирую токен для насмешливых целей. Однако, похоже, что генератор токенов предполагает, что подпись имеет закрытый ключ, хотя это не так. Ключ - publi c, полученный из JWKS. Я не знаю, как объяснить это генератору токенов. Может кто-нибудь мне помочь? Это мой код:

private async Task<string> GenerateSecurityToken(string _expDate, string _issuer, string _audience, string _wellKnownEndpoint)
    {            
        var configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(_wellKnownEndpoint, new OpenIdConnectConfigurationRetriever());
        OpenIdConnectConfiguration openIdConfig = await configurationManager.GetConfigurationAsync(CancellationToken.None);
        SecurityKey securityKey = openIdConfig.SigningKeys.Last();

        var tokenDescriptor = new SecurityTokenDescriptor()
        {
            Subject = new ClaimsIdentity(),
            Expires = DateTime.UtcNow.AddMinutes(double.Parse(_expDate)),
            Audience = _audience,
            Issuer = _issuer, 
            SigningCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.RsaSha256Signature)
        };

        var tokenHandler = new JwtSecurityTokenHandler();
        SecurityToken token = tokenHandler.CreateToken(tokenDescriptor); // Raises exception

        return tokenHandler.WriteToken(token);
    }

И это повышенное исключение:

System.InvalidOperationException: IDX10638: Невозможно создать SignatureProvider, 'key.HasPrivateKey' ложно, не может создавать подписи.

1 Ответ

0 голосов
/ 24 апреля 2020

Поставщик удостоверений использует закрытый ключ для шифрования токена, и при проверке токена вы можете получить криптографию с открытым ключом c, чтобы подписать токены и убедиться, что они действительны. Таким образом, вы можете использовать традиционный способ получения токена доступа от провайдера идентификации с помощью делегирующих потоков, вместо использования ключа publi c для выдачи токена доступа вручную.

...