Uso de JWT para implementar la autenticación en Asp.net api WEB


He estado leyendo sobre JWT.

Pero por lo que he leído no es un mecanismo de autenticación, sino más bien un componente crucial en un mecanismo de autenticación.

Actualmente he implementado una solución que funciona, pero era solo para probar JWT y ver cómo funciona. Pero lo que estoy buscando ahora es cómo uno debe hacer uso de ella. Desde mi experiencia, es básicamente un mecanismo de encriptación que te da una clave encriptada única. También puede poner información dentro de esta ficha.

Quiero implementarlo en términos de un ASP.NET web api 2 para ser consumido por una aplicación móvil.

Así que paso 1:

  1. app = > Server: Login (user, pasword)
  2. Server = > app: Iniciar sesión OK, aquí tienes tu JWT
  3. app = > server: Obtener mi perfil (envía JWT con solicitud) Luego, el servidor descifra JWT y determina la identidad de las solicitudes.

Ahora esto es solo mi comprensión de ello, Mira podría estar en el totalmente equivocado camino.

¿Es el Ideal de JWT para que no tenga que autenticarse en cada solicitud? Simplemente autentico las credenciales de los usuarios una vez (en el inicio de sesión inicial) y allí después de que el servidor simplemente puede usar JWT y no tiene que buscar los usuarios pw y el usuario en la base de datos?

Solo quiero usar el JWT para identificar quién es el usuario. Entonces lo autorizaré después de haberlos autenticado. Como sé, hay una gran confusión con el nuevo MVC y la Autenticación y Autorización.

So a qué se reduce mi pregunta.

¿Cómo puedo Implementar de forma segura y efectiva un Mecanismo de Autenticación Utilizando JWT? No quiero simplemente toser algo que parece funcionar y no tener ninguna idea de las implicaciones de seguridad. Estoy seguro de que existe una fuente en alguna parte que posiblemente ha diseñado un mecanismo seguro que se adapte a mis necesidades.

Mis requisitos son:

  • Solo debe tener que comprobar la base de datos para las credenciales de los usuarios una vez desactivada por sesión? Debido al uso de bcrypt usando una gran cantidad de recursos para comparar contraseñas.
  • Debe ser capaz de identificar al usuario a partir de su solicitud. (Es decir, quiénes son, userId será suficiente) y preferiblemente sin acceder a la base de datos también
  • Debe tener una sobrecarga lo más baja posible, con respecto a los recursos en el lado del servidor que procesan la solicitud.
  • Si un intruso tuvo que copiar una solicitud previa de dispositivos, entonces no debería poder acceder a los datos reales de los usuarios. (obviamente)

Gracias

Author: Thomas Sobieck, 2014-05-15

2 answers

Su comprensión de los JWT es buena. Pero aquí hay un par de correcciones y algunas recomendaciones.

Autenticación y Autorización

  • Los JWT no tienen nada que ver con la autenticación. Golpear su base de datos y contraseñas de hash solo ocurre cuando se autentica en la creación del JWT. Esto es ortogonal a JWTs y puedes hacerlo de cualquier manera que quieras. Personalmente me gusta Membership Reboot, que también tiene un buen ejemplo de uso de JWTs.
  • Teóricamente, usted podría hacer que el usuario ingrese una contraseña una vez al año y que el JWT sea válido todo ese año. Lo más probable es que no sea la mejor solución, si el JWT es robado en cualquier momento, los recursos de los usuarios se verían comprometidos.

Cifrado

  • Los tokens pueden, pero no tienen que estar encriptados. Cifrar sus tokens aumentará la complejidad de su sistema y la cantidad de computación que su servidor necesita para leer los JWTs. Esto puede ser importante si requiere que nadie sea capaz de leer el token cuando está en reposo.
  • Los tokens siempre están firmados criptográficamente por el emisor para garantizar su integridad. Lo que significa que no pueden ser manipulados por el usuario o un tercero.

Reclamaciones

Sus JWT pueden contener cualquier información que desee. El nombre del usuario, fecha de nacimiento, correo electrónico, etc. Usted hace esto con una autorización basada en reclamos. A continuación, simplemente dígale a su proveedor que haga un JWT con estas reclamaciones del Principio de Reclamaciones. El siguiente código es de esa Membresía Ejemplo de reinicio y le muestra cómo se hace esto.

public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    var svc = context.OwinContext.Environment.GetUserAccountService<UserAccount>();
    UserAccount user;
    if (svc.Authenticate("users", context.UserName, context.Password, out user))
    {
        var claims = user.GetAllClaims();

        var id = new System.Security.Claims.ClaimsIdentity(claims, "MembershipReboot");
        context.Validated(id);
    }

    return base.GrantResourceOwnerCredentials(context);
}

Esto le permite controlar con precisión quién está accediendo a sus recursos, todo sin golpear el servicio de autenticación intensivo del procesador.

Aplicación

Una forma muy fácil de implementar un proveedor de tokens es usar el servidor de autorización OAuth de Microsoft en su proyecto WebAPI. Le da los fundamentos básicos de lo que necesita para hacer un servidor OAuth para su API.

Usted también podría mirar en Servidor de identidad de Thinktecture que le daría un control mucho más fácil sobre los usuarios. Por ejemplo, puede implementar fácilmente tokens de actualización con el servidor de identidad donde el usuario se autentica una vez y luego durante una cierta cantidad de tiempo (tal vez un mes) pueden continuar recibiendo JWT de corta duración del Servidor de identidad. Los tokens de actualización son buenos porque pueden ser revocados, mientras que los JWT no pueden. La desventaja de esta solución es que necesita configurar otro servidor o dos para alojar el Servicio de identidad.

Para lidiar con su último punto, que un intruso no debería ser capaz de copiar la última solicitud para obtener acceso a un recurso, debe usar SSL como mínimo. Esto protegerá el token en el transporte.

Si está protegiendo algo extremadamente sensible, debe mantener la vida útil del token en un período de tiempo muy corto. Si usted está protegiendo algo menos sensible, usted podría hacer la vida más larga. Cuanto más largo sea el token si es válido, más grande la ventana de tiempo que un atacante tendrá que hacerse pasar por el usuario autenticado si la máquina del usuario está comprometida.

 55
Author: Thomas Sobieck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-31 21:30:40

He escrito una entrada de blog detallada sobre la configuración del servidor de autorización de OWIN para emitir tokens web JSON firmados en lugar del token predeterminado. Por lo tanto, los servidores de recursos (Audiencia) pueden registrarse con el servidor de autorización, y luego pueden usar los tokens JWT emitidos por la parte emisora de tokens sin la necesidad de unificar los valores de machineKey entre todas las partes. Puedes leer el post JSON Web Token en ASP.NET Web API 2 usando Owin

 22
Author: Taiseer Joudeh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-29 21:10:05