2011-05-16 23 views
17

Estoy empezando a creer que soy un programador groseramente incompetente. Después de mucha lectura, todavía no puedo encontrar la manera de implementar de forma limpia un mecanismo de autenticación para un servicio RESTful WCF.WCF, servicios web RESTful y autenticación personalizada

He intentado todo:

  1. Siguiendo this guide, sólo para descubrir que el mecanismo de autenticación propuesto es un hack feo.

  2. Instalación de the WCF REST Starter Kit, solo para descubrir que está obsoleta y se ha reemplazado por otra plantilla de proyecto.

  3. Instale said project template, solo para descubrir que no proporciona ningún mecanismo de autenticación propio.

  4. Instalar an IIS module that provides custom authentication functionality at transport level, solo para descubrir que el autor proporciona cero documentación. solo para descubrir que necesito implementar un MembershipProvider. (Quiero proporcionar solamente una UserNamePasswordValidator.)

¿Hay alguna manera sensata para poner en práctica un mecanismo de autenticación para un servicio WCF REST?

+3

Pasé por el mismo camino. Tener problemas similares al tratar con las jerarquías de recursos y llegar a la comprensión obvia de que WCF tal como es, no le va bien en la mentalidad REST. Puedes hacerlo, pero se siente raro. Creo que el equipo de WCF lo sabe y están intentando abordarlo (http://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 una IMO sana así que no una respuesta. – ale

Respuesta

10

Cuando estaba investigando cómo implementar la seguridad para mi propio servicio WCF RESTful pasé un tiempo mirando cómo otros servicios populares como flickr y amazon implementan su propia seguridad, suponiendo que probablemente hayan pasado mucho más tiempo pensando en ello que yo tengo El documentation de Flickr en particular ayudó a dar forma a cómo formé mis firmas y solicitudes.

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

creé una costumbre HMAC ServiceAuthorizationManager que valida la firma de cada solicitud, ya que viene en cada petición contiene el siguiente:.

  • un token de usuario
  • marca de tiempo
  • nonce
  • firma

Usando esta información, el administrador puede buscar el secreto del usuario de su token y puede recrear la firma en el servidor utilizando la información proporcionada.

Mi firma consiste en un hash MD5 de los siguientes (los valores se concatenan juntos en un orden específico y algoritmo hash lo que el valor se puede repetir en el servidor):

  • apikey
  • UserToken
  • secreto
  • marca de tiempo
  • nonce

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

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

+1

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

+0

¿Tiene algún código de muestra para este enfoque? – Mike

+0

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

Cuestiones relacionadas