Como tokens JWT se están convirtiendo en un formato cada vez más importante para OAuth 2 tokens, es muy importante saber cómo hacerlas y cómo crear un certificado auto firmado para su uso en el desarrollo y prueba. El propósito principal de este publicación es en realidad la siguiente afirmación que cert ya que creará un certificado firmado auto plenamente operativo para JWT firma de tokens.

Creando un certificado firmado

makecert -r -pe -n “CN=My JWT Signing Cert” -eku 1.3.6.1.5.5.7.3.3 -ss my -sr localMachine -len 2048 -sky exchange -sp “Microsoft RSA SChannel Cryptographic Provider” -sy 12 “MyJWTSigningCert.cer”

NOTA: Usted debe copiar el certificado en el almacén de certificados de confianza.

Creando el Token

El siguiente es un ejemplo de un controlador al descubierto, mínimo de OAuth 2 token. No valida al usuario en absoluto por lo que sólo lo tratan como un ejemplo de cómo generar un token JWT (este no es el código de producción). Hay que descargar el controlador de Microsoft JWT de Nuget. El código CertificateHelper es sólo un código simple para obtener un certificado del almacén de certificados, voy a poner un ejemplo al final del post para complementar.

[RoutePrefix("auth/token")]
public class TokenController : ApiController
{
    [Route("")]
    public IHttpActionResult Post([FromBody]OAuthPasswordGrantRequestModel oAuthPasswordGrantRequestModel)
    {
        var cert = CertificateHelper.FindByThumbprint(""Ž"Ž"Ž"Žb29fde59011709518392183bc643431262a9dd5e", StoreName.My, StoreLocation.LocalMachine);
 
        var claims = new List<Claim>
            {
                new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", oAuthPasswordGrantRequestModel.Username)
            };
 
        var jwtSecurityTokenHandler = new JwtSecurityTokenHandler();
 
        var x509SigningCredentials = new X509SigningCredentials(cert);
        SecurityToken securityToken = new JwtSecurityToken(
            "MyIssuer",
            audience: "MyAudience",
            claims: claims,
            lifetime: new Lifetime(DateTime.UtcNow, DateTime.UtcNow.AddMinutes(60)),
            signingCredentials: x509SigningCredentials);
 
        var jwtToken = jwtSecurityTokenHandler.WriteToken(securityToken);
 
        return Ok(new TokenResult() { access_token = jwtToken });
    }
}

Y allí es, dado el punto final de una llamada y obtendrá un token JWT firmado válido.

Clase CertificateHelper

public static class CertificateHelper
{
    public static X509Certificate2 FindByThumbprint(
        string thumbprint,
        StoreName storeName,
        StoreLocation storeLocation)
    {
        var certificateStore = new X509Store(storeName, storeLocation);
        certificateStore.Open(OpenFlags.ReadOnly);
 
        foreach (var certificate in certificateStore.Certificates)
        {
            if (certificate == null || certificate.Thumbprint == null)
            {
                continue;
            }
 
            if (String.Equals(certificate.Thumbprint, thumbprint, StringComparison.CurrentCultureIgnoreCase))
            {
                certificateStore.Close();
                return certificate;
            }
        }
 
        throw new ArgumentException(
            string.Format("Cannot find certificate with thumbprint {0} in certificate store ", thumbprint));
    }
}
(Visitado 246 veces, 1 visitas hoy)