Pregunta

Todo esto está relacionado con el enlace WebHttp, alojado en un Host de servicio personalizado (IIS no es una opción en este momento).

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

También me gustaría agregar la capacidad de acceso HTTP anónimo y hacer que mis implementaciones personalizadas pongan al usuario Anónimo en algunos roles predeterminados, etc. (si no se envía un encabezado de autenticación).

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ásico, el encabezado Autenticar se ignora por completo.

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

¿Fue útil?

Solución

En primer lugar, el servicio responde correctamente a la llamada anónima, de acuerdo con la especificación .

Segundo, esto es imposible. Cuando está auto hospedando su servicio y tiene algún enlace http, WCF usará un System.Net.HttpListener para poder responder a solicitudes http (creadas en System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen ) . Este oyente tiene un método llamado HandleAuthentication que se llama mucho antes de que se llame a cualquiera de su código personalizado. Es responsable de devolver la respuesta 401 con el desafío (WWW-Autenticación). No hay nada que puedas hacer al respecto. Si la hay, me gustaría saber.

Así que te quedan las siguientes opciones:

  • dos puntos finales
  • configure sus clientes para conocer las credenciales predeterminadas
  • cambie sus clientes para que puedan responder al desafío

Otros consejos

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 quieres). Simplemente, WCF no lo admite directamente.

Sin embargo, WCF es extremadamente personalizable y es probable que puedas hacerlo escribiendo un enlace / canal personalizado que haga lo que quieras. Le recomiendo que eche un vistazo al REST Chess código fuente . Debería empezar.

Su mejor apuesta es implementar roles predeterminados a través de un proveedor de roles y permitir que usuarios anónimos se unan automáticamente a ese rol. Luego, ya sea programáticamente, o mediante una política de inyección de políticas (orientada a aspectos), establezca 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 así como "hacky".

No lo creo ... Estaba escribiendo que necesitas crear un punto final separado cuando decidí leer tu pregunta de nuevo y noté la última afirmación de tu pregunta. Entonces la respuesta sería no (que yo sepa)

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