es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Certificado para AddSigningCredential.

Soy nuevo en IdentityServer4 y estoy tratando de crear un JSON Web token. Para desarrollo, he utilizado AddDeveloperSigningCredential, pero para otros entornos necesito utilizar AddSigningCredential, pero no sé cómo obtener un certificado. En realidad, no tengo ningún certificado y no estoy seguro de cómo generarlo. ¿Alguien puede proporcionar información sobre cómo generar un certificado y usarlo con AddSigningCredential y luego, después de la creación del token, cómo puedo validar el token utilizando el mismo certificado en la API?

Después de generar el certificado como se describe en los comentarios, he agregado el siguiente código:

Código en el servidor de identidad:

services.AddIdentityServer()
    .AddAspNetIdentity<identityuser>()
    .AddConfigurationStore(options =>
    {
        options.ConfigureDbContext = builder =>
            builder.UseSqlServer(connectionString, opt => opt.MigrationsAssembly(migrationAssembly));
    })
    .AddOperationalStore(options =>
    {
        options.ConfigureDbContext = builder =>
            builder.UseSqlServer(connectionString, opt => opt.MigrationsAssembly(migrationAssembly));
    })
    .AddSigningCredential(certificate);

Código en la API:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Authority = "localhost:44339";
    });

El emisor es:

{
    "issuer": "localhost:44339",
    "jwks_uri": "https://..."
}

He obtenido esta información desde https://localhost:44339/.well-known/openid-configuration.

Estoy obteniendo un error 401 en Postman y el error que obtengo es:

WWW-Authenticate: Bearer error="invalid_token", error_description="The audience 'policyservice' is invalid"

Tags:  

Answer

  1. Avatar for davy.ai

    Para generar un certificado para su uso con AddSigningCredential en IdentityServer4, puede utilizar una herramienta como OpenSSL. Aquí están los pasos que puede seguir:

    1. Instale OpenSSL en su máquina si aún no está instalado.
    2. Abra la línea de comandos y navegue hasta el directorio bin de OpenSSL.
    3. Ejecute el siguiente comando para generar una clave privada:

      openssl genrsa -des3 -out private.key 2048

      Esto generará una clave privada de 2048 bits con encriptación.

    4. Ejecute el siguiente comando para generar una solicitud de firma de certificado (CSR):

      openssl req -new -key private.key -out certificate.csr

      Esto generará una CSR, que es una solicitud de un certificado SSL/TLS.

    5. Envíe la CSR a una autoridad de certificación (CA) o a una CA autofirmada para obtener un certificado.

    6. Una vez que tenga el certificado, ejecute el siguiente comando para eliminar la encriptación de la clave privada:

      openssl rsa -in private.key -out private.pem

      Esto creará un nuevo archivo llamado private.pem, que es la clave privada sin encriptación.

    7. En su código de IdentityServer4, reemplace AddDeveloperSigningCredential por AddSigningCredential y pase el certificado como parámetro:

      services.AddIdentityServer() .AddAspNetIdentity<identityuser>() .AddConfigurationStore(options => { options.ConfigureDbContext = builder => builder.UseSqlServer(connectionString, opt => opt.MigrationsAssembly(migrationAssembly)); }) .AddOperationalStore(options => { options.ConfigureDbContext = builder => builder.UseSqlServer(connectionString, opt => opt.MigrationsAssembly(migrationAssembly)); }) .AddSigningCredential(certificado);

    8. En su código de API, agregue la autoridad y configure la autenticación de portador JWT para validar el token utilizando el mismo certificado:

      builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = "localhost:44339"; options.TokenValidationParameters.ValidateAudience = true; options.TokenValidationParameters.ValidAudience = "policyservice"; options.TokenValidationParameters.ValidateIssuerSigningKey = true; options.TokenValidationParameters.IssuerSigningKey = new X509SecurityKey(certificado); });

      Asegúrese de reemplazar “policyservice” con el nombre real del público objetivo.

    9. Por último, intente acceder a los puntos finales de su API utilizando un token de acceso válido. Si todo está configurado correctamente, el token debería validarse correctamente y podrá acceder a los recursos protegidos. Si obtiene un error 401, asegúrese de que el token sea válido y tenga el público objetivo y el emisor correctos.

Comments are closed.