Inicio de sesión reparador – implementación adecuada

Nuevo en los servicios RESTful, pero lee mucho sobre el tema. Implementando en VS2010 C #

Preguntas similares (casi idénticas) se han formulado y respondido aquí en stackoverflow, pero honestamente no aprendí nada de las respuestas.

Quiero implementar una llamada de AuthenticatUser donde se envía un nombre de usuario y una contraseña y se devuelve una clave de autenticación.

Dado que esto debe hacerse con un GET, POST, PUT, O DELETE, parece que el GET sería el más apropiado.

Entonces quizás GET mydomain / myservice / authenticate / {username} / {password}

No me gusta esto porque el nombre de usuario y la contraseña se pasan en el URI, pero como entiendo, no es una buena idea enviar un cuerpo en un GET. Así que un POST o PUT funcionaría, pero eso parece divergir de la filosofía RESTFul.

Pregunta 1: ¿Está bien enviar datos confidenciales como la contraseña en la URL? El sitio utilizará SSL.

Pregunta 2: En los GET, cuando se pasan varios parámetros, parece que el concepto de URI se volverá un poco loco, ¿cómo se deben manejar las consultas complejas de forma RESTOSA?

Pregunta 3: ¿Cuál es el método de autenticación preferido (normal, más común) en una API RESTful?

No es correcto pasar la contraseña en la url. He hecho algunas investigaciones sobre esto. En primer lugar, debe utilizar la autenticación básica sobre SSL si es posible. En el encabezado de autenticación, pase el ID de usuario y la contraseña. Ahora, en lo que respecta al descanso, la sesión no se mantiene en el servidor. Por lo tanto, debe pasar el ID de usuario y la contraseña para cada llamada. Es riesgoso almacenar la contraseña en el almacenamiento local. Por lo tanto, utilice una llamada POST para la primera autenticación y pase el ID de usuario y la contraseña. Luego, al regresar de la autenticación exitosa, el servidor devuelve una clave de token y un valor de token. tokenkey y tokenvalue son similares al intercambio de claves privadas de Amazon inicialmente. A partir de la siguiente solicitud, envíe el tokenkey y firme sus datos con tokenvalue. Pase el tokenkey y la firma cada vez. En serverend, el servidor verifica la firma ya que tiene una copia de tokenvalue. tokenkey y tokenvalue pueden almacenarse localmente si es posible cifrados. No puedes usar el tokenkey y el tokenvalue para siempre. Por lo tanto, en cada solicitud, el servidor envía un nonce en respuesta. Este nonce se almacena en la base de datos en el extremo del servidor y cambia para cada solicitud. Cuando envíe una solicitud al servidor incluya este nonce. El nonce se forma utilizando la marca de tiempo. Si se envía una solicitud, digamos que después de 15 minutos, se descifra el nonce y se encuentra que la marca de tiempo es de más de 15 minutos y, por lo tanto, lo redirecciona a la página de inicio de sesión. La formación de Nonce se da en http://www.ietf.org/rfc/rfc2617.txt . Una vez que el nonce se valida con éxito, este nonce se descarta y se envía un nuevo nonce (se forma nuevamente con la última marca de tiempo). Esto también ayudará a prevenir el ataque de repetición.