2011-07-25 10 views
10

Los requisitos:Cómo pasar más datos a continuación, el nombre de usuario/contraseña para el método de servicio en WCF 4.0 servicio REST, mediante la autenticación básica

WCF 4.0 host de IIS la autenticación básica con origen personalizado REST

hay un montón de ejemplos y formas de cómo implementar la autenticación básica, el uso de UserNamePasswordValidator, Comedero ServiceAuthorizationManager y IDispatchMessageInspector, etc.

el problema que estoy enfrentando es, que la validación en realidad, obtendrá mucha más información del back-end de autenticación, que la respuesta sí/no. Y quiero pasar esta información de alguna manera a los métodos de servicio invocados (es decir, será un objeto de usuario completo, con muchas propiedades para controlar el comportamiento del servicio). Quiero evitar una segunda llamada a la tienda de usuarios para recuperar los datos en función del nombre de usuario, al que puedo acceder desde el contexto de seguridad.

Hasta el momento, lo más parecido que he encontrado es this solution, que utiliza el WCF REST Starter Kit 's RequestInterceptor, en la que puedo inyectar una subclase de ServiceSecurityContext para llevar a cabo mis datos, y echó ServiceSecurityContext.Current de vuelta en el método de servicio.

El problema con lo anterior es que está escrito para WCF 3.5 y que me gustaría evitar el uso del Starter Kit.

La pregunta: cualquier idea de cuál sería el lugar más apropiado para engancharse en la cadena, para que pueda pasar datos de la lógica de validación al servicio. O para decirlo de otra manera, ¿dónde podría reemplazar el contexto de seguridad con el mío personalizado para llevar a cabo la carga? O cualquier otro mecanismo de transporte?

lo que busco es que el comportamiento:

Cliente (podría ser un navegador) trata de utilizar el servicio: GET https://myservcer/service/data El servidor responde con "Autenticación básica necesaria" Los equipos de cliente de cabecera de autenticación básica y envía la solicitud nuevamente El servidor, basado en el usuario/pase en el encabezado, saca un objeto de Usuario de la base de datos. Si no se encuentra el usuario, la autenticación de solicitudes de nuevo Si no se encuentra el usuario, el objeto de usuario se pasa de alguna manera el método de servicio Todo esto debería ocurrir sin hacer segundo ida y vuelta a la base de datos

Hasta el momento, lo que entiendo es , ese UserNamePasswordValidator no funcionará; no hay forma de pasar el objeto User si lo recupero allí.

Puedo crear una IAuthorizationPolicy personalizada o SecurityToken (cuál), y poner el objeto User in. Pero ... donde esto debería suceder. ¿Puedo ir con UserNameSecurityTokenAuthenticator para esto? ¿Va a devolver el código de error HTTP correcto para pedir credenciales? ¿Cómo/dónde modifico el web.config para usar mis cosas personalizadas? Hasta ahora veo cómo configurar el uso de UserNamePasswordAuthenticator personalizado solamente.

EDITAR: por favor, compruebe my own answer para mi enfoque. Sin embargo, la pregunta era buena, y las respuestas que obtuve fueron valiosas.

Respuesta

4

hemos implementado nuestro propio módulo de autenticación HTTP. El módulo se conecta al evento "autenticación de solicitud" de HttpApplication y ejecuta la autenticación en el back-end. El servidor es libre de devolver todo lo que quiera (y en nuestro caso devuelve más que sí/no. El objeto que se devuelve implementa la interfaz System.Security.Principal.IIdentity. Una vez que la autenticación tiene éxito, adjuntamos la identidad (objeto devuelto por auth) al director que se deja llevar en el HttpContext.User.

por la tubería se puede acceder de usuario del contexto actual en cualquier punto y obtener todos los datos de su identidad.

el único inconveniente importante de este enfoque es que requiere compatibilidad con ASP.net, pero si ya está ejecutando sus servicios de Rest de esa manera, entonces no debería ser un problema.

+0

Gracias. Estaba viendo un enfoque similar: el módulo que estaba viendo es: http://www.codeproject.com/KB/aspnet/mybasicauthentication.aspx. Y el mismo tipo muestra cómo enlazar la línea: http://www.leastprivilege.com/HTTPBasicAuthenticationAgainstNonWindowsAccountsInIISASPNETPart3AddingWCFSupport.aspx. ¿Pasó por algo similar, o ha encontrado algún atajo para obtener la identidad del contexto? –

+0

Es un poco diferente de cómo se muestra en los enlaces. Estábamos buscando 1) hacer que la unidad de pieza de autenticación se pudiera probar, por lo que debíamos eliminar todas las dependencias de HttpContext.Current. 2) Permita que la identidad sea provista por HttpContext.Current en la lógica comercial porque el mismo BL podría invocarse desde otros lugares que no sean el servicio web. Para hacer esto, creamos IdentityFactories, y cuando el proceso se está ejecutando bajo WS, inyectamos una fábrica que mira el HttpContext. ¿Tiene sentido? Puedo editar la respuesta con más detalles más adelante. En este momento estoy apurado, espero que esto ayude. – ale

+0

Esto tiene sentido. Mi Q. fue si ha interceptado en estos lugares exactos, como se muestran, o ha encontrado una forma más adecuada. De lo contrario, tienes razón sobre las fábricas. –

0

Puede crear una implementación de IAuthorizationPolicy y reemplazar la identidad principal con la que obtiene durante la autenticación.Echar un vistazo a estos enlaces que muestran cómo evitar golpear la base de datos dos veces:

WCF Custom Validator: How to initialize a “User” object from custom validator

When and where to set custom IIdentity when implementing custom authentication

+0

He leído y sigo leyendo y releyendo todos estos artículos, pero parece que todos al final se confunden y, por lo general, deciden ir por otro camino. Editaré mi pregunta con más detalles, pero aun así no tengo solución para mi problema. –

0

Terminé no siendo nosotros ing WCF en absoluto. Nancy fue mucho más fácil de crear y probar REST API completa, y con el latest changes (será en 0.8 ver) lo que pregunté es muy fácil.

Cuestiones relacionadas