Pregunta

¿El WCF 4.0 tiene una clase analógica / módulo / lo relacionado con la requestivista de inicio de inicio de WCF Starter?

¿Fue útil?

Solución

No hay nada que se mapea 1-1, pero puede usar un IdispatchMessageInspector del núcleo WCF para implementar la mayoría de los escenarios para los cuales el Solicitinspector hará.La publicación en http://blogs.msdn.com/b/carlosfigueira/archive/2011/04/19/wcf-exensibilidad-message-inspectors.aspx tiene alguna información detallada sobre los inspectores de mensajes.

Otros consejos

Estoy de vuelta con una actualización.

Surgo para valorar la simplicidad en el código y después de resolver con éxito este problema, no puedo decir que lo prefiero más que el método de cadena de consulta. Deje caer una sola llamada en cada punto final de servicio que llama un método AUTHN junto con el método Authz parece más fácil de lo que algunos podrían creer.

De todos modos, suficiente de las opiniones ... en la solución. La solución está justo debajo de nuestros ojos en StackoverFlow en este enlace, pero no está bien descrito en nuestro contexto ... así que le daré crédito a "User634119" para el código de muestra que se encuentra aquí: encabezados en OperationContext

Primero, debemos agregar un servicio de servicio a nuestro archivo web.config:

<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceAuthenticationManager serviceAuthenticationManagerType="WCF.BasicAuthorization, WCF"></serviceAuthenticationManager>
      <serviceAuthorization impersonateCallerForAllOperations="false" principalPermissionMode="Custom" serviceAuthorizationManagerType="WCF.BasicAuthentication, WCF">
      </serviceAuthorization>
    </behavior>
  </serviceBehaviors>
</behaviors>

Siguiente Haga una clase (llamada autorización basada en el bloque de ServiceBehaviors anteriores):

//Authorize the call against the URI resource being requested...
public class BasicAuthorization : ServiceAuthorizationManager
{
    public override bool CheckAccess(OperationContext operationContext, 
    ref Message message)
    {
        //some code
    }
}

Siguiente Haga una clase de autenticación:

// Authenticate the header signature as described in my previous post
public class BasicAuthentication : ServiceAuthenticationManager
{
    public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(
        ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri, 
        ref Message message)
    {
        //some code
    }
}

En el método Autenticate, use HTTPREPEQUESTMESSAsProperty para extraer los detalles del encabezado de la solicitud y realice los mismos 3 pasos descritos en mi primera respuesta.

eduardo, usted hizo: @carlosfigueira: ¿Puedo usarlo para implementar un subsistema de autenticación?

Estoy trabajando en ese mismo problema y tengo al menos una solución (que se describe a continuación) para usted y una próxima autorización basada en el encabezado (que creo es el que está pensando en "interceptar").

La forma más sencilla de asegurar un punto final basado en el modelo de programación WEBHTTP de WCF 4 SOBTTP es este:

  1. emitir una clave secreta compartida y una clave API de cada cliente para usar como credenciales. La clave API es realmente la misma que un nombre de usuario.
  2. Ejecute todos los puntos finales sobre SSL para asegurarse de que siempre tenga la seguridad de los canales / mensajes / datos
  3. exige que los clientes utilicen el secreto compartido para generar una cadena de firma HMAC-SHA1 (o Equiv) que incluye una marca de tiempo y su clave API.
  4. requiere que el cliente pase los 3 de estos como parámetros de cadenas de consulta en cada solicitud :
    • Firma
    • marca de tiempo
    • llave API
    • Ejemplo: https:/127.0.0.1/RESTENDPointPoint?sig= {SigString} & Apikyy= {apikey} & timestamp= {timestamp} y todos sus otros parámetros aquí ...
    • en su lado de servicio, implemente un método de autenticación que toma las 3 cuerdas y luego:
      • busca la clave API y devuelve el secreto compartido del cliente que usted tiene en un DB o en otro lugar.
      • Compare la marca de tiempo contra DateTime. Ahora para asegurarse de que la solicitud no tiene más de 15 minutos de edad para defenderse de los ataques de reproducción.
      • usando esas 3 cuerdas, vuelve a crear la cadena de firmas y comparar la suya a la que pasa el cliente.
      • Si coinciden, el solicitante es auténtico.

        Ahora, la mejor manera de hacerlo es utilizando el encabezado de solicitud de autorización HTTP para almacenar esas 3 cadenas y tener un proceso de interceptor-ish global. Mire todas las solicitudes. Esto evitaría que el potencial de un punto final expuesto sin un bloque de autenticación (bueno, al menos es menos probable).

        Problema con el uso de la cadena de consulta para llevar toda esta información es que la cadena de consulta tiene una longitud máxima de 2K (que varía según el cliente / navegador) y la cadena de consulta es muy difícil de leer cuando se depura ... pero solo acostumbrarse a eso.

        Algunos Piense que una forma más sofisticada de hacerlo es un modelo de STS en el que necesita que el cliente pase estas 3 cadenas de autenticación a un punto final de servicio de seguridad. El mensaje de respuesta devolvería un token de sesión que el cliente pasaría en cada llamada en lugar de las 3 cadenas. Es cierto que para el cliente no hay necesidad de generar una firma de hash de HMAC en cada llamada, pero el lado del servidor aún debe autenticar el token y el concepto de la sesión se inquieta el comportamiento sin poca distancia.

        Haré todo lo posible para publicar bloques de código que implementen tanto la cadena de consulta como las metodologías de encabezado de autenticación.

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