2008-10-16 20 views
8

Todo esto pertenece al enlace WebHttp, alojado en un Host de servicio personalizado (IIS no es una opción en este momento).WCF WebHttp Mixed Authentication (Basic AND Anonymous)

Implementé un UserNamePasswordValidator personalizado y una IAuthorizationPolicy personalizada. Cuando configuro el enlace del punto final para usar la autenticación básica, todo funciona de la manera que me gustaría (principal personalizado, roles personalizados, etc.).

Me gustaría agregar también la capacidad para el acceso anónimo HTTP, y hacer que mis implementaciones personalizadas pongan al usuario anónimo en algunas funciones predeterminadas, etc. (si no se envía el encabezado Autenticar).

Lo que sucede ahora es que a los usuarios anónimos se les da un 401 antes de que se golpee cualquiera de mis códigos personalizados. Si desactivo el requisito de autenticación HTTP básica, el encabezado Autenticar se ignorará por completo.

¿Cómo configuro, o inyecto un encabezado de autenticación, para hacer esto de ambas formas (sin crear 2 puntos finales separados)?

+1

No sé la respuesta ...Acabo de darte +1 para que llegues a 1000;) – sebagomez

+0

vamos, hay mejores respuestas a esta pregunta, la marcada como correcta es apenas coherente –

+0

@Sam Gracias por los comentarios. Asigné la respuesta donde mejor se ajustaba. Es una decisión difícil. Sebastián respondió correctamente primero. Claro, otros son más coherentes. Al volver a leer (las cosas cambiaron en los últimos 9 meses desde que se publicó Q), asigné lo que creo que es lo mejor. Gracias – TheSoftwareJedi

Respuesta

1

En primer lugar, el servicio responde correctamente a la llamada anónima, según el specification.

En segundo lugar, esto es imposible. Cuando se autohospeda en su servicio y tiene un enlace HTTP, WCF utilizará una instancia System.Net.HttpListener para poder responder a las solicitudes http (creadas en System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen). Este oyente tiene un método llamado HandleAuthentication que se llama way antes de llamar a cualquiera de sus códigos personalizados. Es responsable de devolver la respuesta 401 con el desafío (WWW-Authenticate). No hay nada que puedas hacer al respecto. Si hay, me gustaría saber.

lo que se obtendrá con las siguientes opciones:

  • dos puntos finales
  • configurar los clientes para conocer las credenciales predeterminadas
  • cambio a sus clientes para que puedan responder al reto
+0

En realidad HttpListener es bastante capaz de soportar múltiples esquemas de autenticación. Solo necesita implementar un controlador para la propiedad AuthenticationSchemeSelectorDelegate de HttpListener. Es WCF lo que te está jodiendo. Una vez más. –

+0

Sí, WCF no proporciona una forma de asociar un controlador a este evento; de lo contrario, sería posible ... –

-2

No lo creo ... Solo escribí lo que necesita crear para separar el punto final cuando decidí leer su pregunta nuevamente y noté la última afirmación de su pregunta. Entonces la respuesta sería no (que yo sepa)

+0

¿Conoces una forma de insertar un encabezado http antes de que la solicitud llegue a WebHttpBinding? Un elemento de enlace personalizado tal vez? Cualquier ejemplo de manipular el encabezado HTTP en un enlace personalizado sería genial. – TheSoftwareJedi

+0

lo siento amigo, yo no ... -1! WTF? – sebagomez

0

He investigado esto en el pasado y descubrí que no es posible a través de la configuración a menos que crees 2 puntos finales separados (que no es lo que deseas). Simplemente, WCF no lo admite de manera inmediata.

Sin embargo, WCF es extremadamente personalizable y usted puede hacer esto escribiendo un canal personalizado/enlace que hará lo que desee. Te recomiendo que eches un vistazo al REST Chess código fuente. Debería comenzar.

0

Su mejor opción es implementar roles predeterminados a través de un proveedor de roles y permitir que los usuarios anónimos se unan automáticamente a esa función. Luego, ya sea de forma programática o mediante una política de inyección de políticas (orientada a aspectos), se establece para que se permita cierto acceso anónimo a través del rol particular.

En cuanto a configurar esto a través de la configuración, si es posible, sería bastante difícil y algo "hacky".

+0

sí, pero ni siquiera llega a ningún proveedor de roles si no obtiene un encabezado de autenticación. Simplemente devuelve rápidamente un 401 del código de enlace. – TheSoftwareJedi

Cuestiones relacionadas