WCF, servicios web RESTful y autenticación personalizada

Empiezo a creer que soy un programador sumamente incompetente. Después de mucha lectura, todavía no puedo averiguar cómo implementar limpiamente un mecanismo de autenticación para un servicio WCF RESTful.

He intentado todo:

  1. Siguiendo esta guía, solo para descubrir que el mecanismo de autenticación propuesto es un truco feo.

  2. Instalación el kit de inicio WCF REST, solo para descubrir que está obsoleto y ha sido reemplazado por otra plantilla de proyecto.

  3. Instalar dicha plantilla de proyecto, solo para descubrir que no proporciona ningún mecanismo de autenticación propio.

  4. Instalar un módulo IIS que proporciona una funcionalidad de autenticación personalizada a nivel de transporte, solo para descubrir que el autor no proporciona documentación. solo para descubrir que necesito implementar un MembershipProvider. (Quiero proporcionar solo un UserNamePasswordValidator.)

¿Hay alguna forma sensata de implementar un mecanismo de autenticación para un servicio WCF RESTful?

preguntado el 16 de mayo de 11 a las 18:05

Seguí exactamente el mismo camino. Tener problemas similares al tratar con jerarquías de recursos y llegar a la conclusión obvia de que WCF tal como es, no le va bien en la mentalidad REST. Puedes hacerlo, pero se siente horrible. Creo que el equipo de WCF lo sabe y están tratando de abordarlo (wcf.codeplex.com/wikipage?title=WCF%20HTTP). De todos modos, esperando la respuesta de alguien aquí, podría usarlo. Escribimos nuestro propio módulo HTTP para ello, pero no en mi sano juicio, así que no es una respuesta. -

1 Respuestas

Cuando estaba investigando cómo implementar la seguridad para mi propio servicio WCF RESTful, dediqué un tiempo a observar cómo otros servicios populares como flickr y amazon implementan su propia seguridad, asumiendo que probablemente hayan pasado mucho más tiempo pensando en ello que yo. Flickr's documentación en particular, ayudó a moldear la forma en que formateé mis firmas y solicitudes.

Al final, elegí un esquema de autenticación HMAC (Código de autenticación de mensajes basado en hash) para mis servicios.

Creé un HMAC ServiceAuthorizationManager personalizado que valida la firma de cada solicitud a medida que ingresa. Cada solicitud contiene lo siguiente:

  • un token de usuario
  • fecha y hora
  • nuncio apostólico
  • firma

Con esta información, el administrador puede buscar el secreto del usuario en su token y puede volver a crear la firma en el servidor utilizando la información proporcionada.

Mi firma consiste en un hash MD5 de lo siguiente (los valores se concatenan juntos en un orden específico y se usan hash para que el valor se pueda repetir en el servidor):

  • Clave API
  • userToken
  • secreto
  • fecha y hora
  • nuncio apostólico

Guardo los nonce en una instancia de Memcache durante un corto período de tiempo para verificar rápidamente cualquier ataque de repetición. Después de ese sesgo de tiempo (aproximadamente 10 minutos), la marca de tiempo se usa para rechazar cualquier otra solicitud anterior.

Puedo publicar algunos fragmentos de mi código si ayuda. En general, he descubierto que la autenticación HMAC es generalmente la forma más segura de hacerlo y es fácilmente compatible con cualquier cliente que usará su servicio (no solo .NET).

contestado el 17 de mayo de 11 a las 23:05

¿Podrías publicar en algún lugar algunos fragmentos de tu código? Sería muy útil. O envíeme un correo electrónico a kral.konf (at) volny.cz. ¡Gracias! - Karel Kral

Desafortunadamente, no tengo acceso a esa fuente en este momento, pero si tengo un momento, veré si puedo preparar otra copia (sabía que debería haberla incluido cuando escribí la respuesta original). - efalconer

Cuánto tiempo más tenemos que esperar para este ejemplo :) - Crucero KID

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.