2008-09-26 9 views
24

Estoy buscando escribir un archivo de configuración que permita servicios RESTful en WCF, pero todavía quiero la capacidad de 'aprovechar' el proveedor de membresía para el nombre de usuario/autenticación de contraseña.Cómo configurar servicios RESTful seguros con WCF usando nombre de usuario/contraseña + SSL

Lo que sigue es parte de mi configuración actual utilizando basicHttp binding o wsHttp w/out WS Security, ¿cómo cambiará esto con los servicios basados ​​en REST?

<bindings> 
     <wsHttpBinding> 
      <binding name="wsHttp"> 
       <security mode="TransportWithMessageCredential"> 
        <transport/> 
        <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="false"/> 
       </security> 
      </binding> 
     </wsHttpBinding> 
     <basicHttpBinding> 
      <binding name="basicHttp"> 
       <security mode="TransportWithMessageCredential"> 
        <transport/> 
        <message clientCredentialType="UserName"/> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="NorthwindBehavior"> 
       <serviceMetadata httpGetEnabled="true"/> 
       <serviceAuthorization principalPermissionMode="UseAspNetRoles"/> 
       <serviceCredentials> 
        <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/> 
       </serviceCredentials> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
+0

Creo que esta es una pregunta relevante, y me gustaría ver más respuestas sobre este tema, ya que actualmente estoy buscando lo mismo. REST es una elección de estilo y diseño, y no debería ser capaz de hacer frente a la autenticación. – GONeale

Respuesta

1

ACTUALIZACIÓN 01/23/2012

Desde que escribí esta pregunta que he visto un mejor enfoque para asegurar RESTO como servicios web en la naturaleza. Parecía complejo cuando escuché por primera vez, pero la idea es simple y en toda la web para los servicios web y otras comunicaciones seguras.

Requiere el uso de claves públicas/privadas.

1.) Cada usuario (cliente) del punto final tendrá que registrarse con su RESTO servicio web

  • a.) Le dé a este usuario una clave privada que no debe ser compartida con cualquiera
  • b.) También generar una clave pública que puede ir sobre el alambre en texto plano, si es necesario (esto también se puede utilizar para identificar al cliente)

2.) cada solicitud desde el usuario necesita generar un hash para firmar el solicitud

  • a.) Un ejemplo de esto podría ser: clave privada + una marca de tiempo + carga cifrada (si es lo suficientemente pequeña como una simple información de usuario para actualizarse)
  • b) usted toma estos 3 (o lo que sea) usted decidió) y generar un hash de 1 vía (usando hmac por ejemplo)
  • c.) en la solicitud que se envía por el cable usted incluye la clave pública (para que el servidor sepa quién está intentando enviar esta solicitud), el hash que se generó con la clave privada y la marca de tiempo.

3.) el punto final del servidor (su método REST) ​​deberá generar un hash utilizando las mismas entradas utilizadas en el cliente. Este paso demostrará que tanto el cliente como el servidor conocían una clave privada que coincidía con la clave pública pasada junto con la solicitud. (Esto a su vez significa que el usuario que envía la solicitud es de fiar, ya que nadie más podía conocer la clave privada)

  • a.) Las operaciones de búsqueda de los clientes clave privada por la clave pública que se pasa a lo largo durante la solicitud

  • b.) Tome los otros parámetros (marca de tiempo y la carga útil codificada) junto con la clave privada que encontró en el paso anterior y use el mismo algoritmo para generar un hash de 1 vía (de nuevo hmac es lo que he visto usado en el mundo real)

  • c) el hash resultante de 1 vía debe coincidir con el hash enviado a través del cable, si no se envía un 400 (o qué siempre código http que considere una "mala solicitud")
1

Antes de continuar por este camino de la lucha para poner en práctica RESTO sobre WCF, le sugiero que lea this mensaje por Tim Ewald. Yo estaba especialmente afectado por la declaración siguiente:

No estoy seguro de que quiera construir sobre una capa diseñada para factorizar HTTP en el parte superior de una capa que fue diseñado para factor de fuera.

He pasado los últimos 12 meses desarrollando material basado en REST con WCF y esa afirmación ha demostrado ser tan cierta una y otra vez. En mi humilde opinión, lo que WCF trae a la mesa se ve superado por la complejidad que presenta para hacer el trabajo REST.

+0

¡Estoy muy contento de saber que no soy el único en notar esto! Hay muchas cosas buenas sobre WCF, pero el soporte de REST me ha dado un montón de problemas. – tomasr

+0

¿Fue WCF diseñado para factorizar HTTP? HTTP es solo una de las opciones de transporte. – pc1oad1etter

+0

Exactamente. HTTP es un protocolo para aplicaciones distribuidas. WCF está diseñado para permitirle crear aplicaciones de distribución de forma independiente del protocolo. –

2

Estoy de acuerdo con Darrel en que los complejos escenarios REST sobre WCF son una mala idea. Simplemente no es bonito.

Sin embargo, Dominick Baier tiene algo de good posts sobre esto en su blog de privilegios menores.

Si desea ver el soporte de la autenticación WSSE con el respaldo al soporte de FormsAuthenticationTicket en WCF, consulte el source code of BlogService.

Cuestiones relacionadas