Cómo configurar servicios RESTful seguros con WCF usando nombre de usuario / contraseña + SSL

StackOverflow https://stackoverflow.com/questions/141484

Pregunta

Estoy buscando escribir un archivo de configuración que permita servicios RESTful en WCF, pero aún así quiero la capacidad de 'acceder' al proveedor de membresía para la autenticación de nombre de usuario / contraseña.

La siguiente es parte de mi configuración actual usando 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>
¿Fue útil?

Solución 7

ACTUALIZACIÓN 01/23/2012

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

Requiere el uso de claves públicas / privadas.

1.) cada usuario (cliente) del punto final deberá registrarse en su servicio web REST

  • a.) le das a este usuario una clave privada que no debe compartirse con cualquiera
  • b.) también generas una clave pública que puede pasar por alto el cable en texto sin formato si es necesario (esto también se usará para identificar al cliente)

2.) cada solicitud del usuario debe generar un hash para firmar la solicitud

  • a.) Un ejemplo de esto podría ser: clave privada + una marca de tiempo + carga útil codificada (si es lo suficientemente pequeña como una simple información de usuario para actualizar, por ejemplo)
  • b.) toma estos 3 (o lo que sea que hayas decidido) y generas un hash de 1 manera (usando hmac, por ejemplo)
  • c.) en la solicitud que se envía por el cable, se 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 que se usaron en el cliente. Este paso probará 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 legítimo, ya que nadie más podría conocer la clave privada)

  • a.) busque la clave privada de los clientes mediante la clave pública que se transmite 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 (nuevamente hmac es lo que he visto utilizado en el mundo real)

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

Otros consejos

Aquí hay un podcast sobre cómo asegurar los servicios REST de WCF con el proveedor de membresía ASP.net:

http: // channel9. msdn.com/posts/rojacobs/endpointtv-Securing-RESTful-services-with-ASPNET-Membership/

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

Sin embargo, Dominick Baier tiene algunos

Si desea ver el soporte de autenticación WSSE con el respaldo a FormsAuthenticationTicket en WCF, consulte el código fuente de BlogService .

Antes de continuar por este camino de lucha para implementar REST sobre WCF, le sugiero que lea este post por Tim Ewald. Me impactó especialmente la siguiente declaración:

  

No estoy seguro de querer construir sobre una   capa diseñada para tener en cuenta HTTP en   parte superior de una capa que fue diseñada para   factoréalo.

He pasado los últimos 12 meses desarrollando cosas basadas 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 aporta a la mesa es superado por la complejidad que presenta para realizar el trabajo de REST.

Independientemente de si la comunidad tiene opiniones en contra de REST en WCF (Estoy personalmente en la valla) , Microsoft lo ha atacado, http://msdn.microsoft.com/en-us/netframework/cc950529.aspx

Sí, de acuerdo con Moto, un enlace del WCF Starter Kit es lo más cercano que vi a la autenticación de credenciales mediante un encabezado HTTP personalizado ( http://msdn.microsoft.com/en-us/library/dd203052.aspx ).

Sin embargo, no pude dar el ejemplo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top