Que es un token web?


Que es un token Web?

Al autenticarnos en un proveedor de identidad, se genera un token. Este token es como una llave que nos permite acceder a servicios. El token Web esta ideado para acceder a servicios Web.

Estructura de un token Web

Este token esta compuesto de 3 cadenas en base64 separadas por puntos con el objetivo de ser compacto y compatible con el formato de Url. Estas 3 cadenas corresponden a 3 bloques:

  • Cabecera: Es un objecto Json que contiene la información del toquen.
    • alg: El algoritmo utilizado para encriptar/descencriptar la firma del token. El RS256 es el asimétrico y el HS256 es el simétrico.
    • typ: tipo del token, normalemente JWT.
  • Datos: Es un objecto Json que tiene la información que transmite el token. Esta parte se suele conocer como el conjunto de Claims. Hay unas claims reservadas que son estandards pero podemos añadir las nuestras.
    • iis/(Issuer): quien genera el token.
    • exp (Expiration): el tiempo que es valido el token.
    • sub (Subject): subconjunto con claims que identifican al usuario y su rol.
    • aud (Audience): indica la servicio web que quiere ser accedido.
  • Firma: Es un hash que nos permite validar el token y asegurar que la información contenida en el mismo no ha sido manipulada.

Para ampliar información, hay una especificación detallada.

Ejemplo de Creación de token en NET en el proveedor de Identidad

Utilizando el algoritmo de clave Simetrica.

public String GetToken()        {
var secretKey = "[Insertar el Password]"
var signingKey = new InMemorySymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey));
var signingCredentials = new SigningCredentials(signingKey,
SecurityAlgorithms.HmacSha256Signature, SecurityAlgorithms.Sha256Digest);
var claimsIdentity = new ClaimsIdentity(new List<Claim>()
{
	new Claim(ClaimTypes.NameIdentifier, "AutoritherUser"),
	new Claim(ClaimTypes.Role, "Author"),
}, "Custom");

var now = DateTime.UtcNow;
var securityTokenDescriptor = new SecurityTokenDescriptor()
{
	AppliesToAddress = "https://servicio.accedido.com",
	TokenIssuerName = "https://provedoor.token.com",
	Subject = claimsIdentity,
	SigningCredentials = signingCredentials,
};
var tokenHandler = new JwtSecurityTokenHandler();
var plainToken = tokenHandler.CreateToken(securityTokenDescriptor);
var signedAndEncodedToken = tokenHandler.WriteToken(plainToken);
return  signedAndEncodedToken;
}

Ejemplo de Validación del token en NET en el servicio web

public void SecurizeApi(String signedAndEncodedToken)      {
            // https://vosseburchttechblog.azurewebsites.net/index.php/2015/09/19/generating-and-consuming-json-web-tokens-with-net/
try
{

	var secretKey = "[Insertar el Password]"   //Debe se la misma que en el ejemplo anterior.
	var signingKey = new InMemorySymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey));
	var tokenValidationParameters = new TokenValidationParameters()
	{
		ValidAudiences = new string[]
		{
		 "https://servicio.accedido.com"
		},
		ValidIssuers = new string[]
		{
		"https://provedoor.token.com"
		},
		IssuerSigningKey = signingKey,
	};
	var tokenHandler = new JwtSecurityTokenHandler();
	SecurityToken validatedToken;
	tokenHandler.ValidateToken(signedAndEncodedToken,
		tokenValidationParameters, out validatedToken);
}
catch (Exception)
{
	throw new HttpException(403, "You don't have access to this resource.");
};
}

Servicios Utiles

Anuncios
Esta entrada fue publicada en net, Seguridad y etiquetada , . Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s