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.
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? –
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
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. –