WCF - ¿Configurando la autenticación cliente / servidor en los encabezados?
-
05-07-2019 - |
Pregunta
Tengo un servicio de WCF que necesitará recibir las credenciales del cliente y mantener algún tipo de datos basados ??en roles, según mi método de autenticación.
Los clientes residirán en muchos sistemas diferentes y, como tal, cada cliente tendrá un ID de usuario y pw únicos.
Estoy usando basicHttpBinding y he leído algunos artículos, como este, http://nirajrules.wordpress.com/2009/05/22/username-over-https-custombinding-with-wcf%E2%80%99s-channelfactory-interface/ , que describen el proceso.
Por lo tanto, lo que busco es si alguien tiene un cliente / servidor completo configurado de esta manera para que pueda ver mi propia solución.
Lo que me gustaría hacer es pasar el nombre de usuario y la contraseña en los encabezados de cada solicitud, devolver algún tipo de excepción SecurityTokenValidationException si falla, o continuar si se pasa.
Gracias.
ACTUALIZAR
Estoy usando wsHttpbinding con la siguiente configuración tanto en el cliente como en el servidor:
<wsHttpBinding>
<binding name="wsHttpEndpointBinding" >
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="Basic" />
<message clientCredentialType="UserName" />
</security>
</binding>
</wsHttpBinding>
Y la llamada al servidor desde el cliente de la siguiente manera:
ServiceReference1.ServiceClient myClient = new ServiceReference1.ServiceClient();
myClient.ClientCredentials.UserName.UserName = "billuser";
myClient.ClientCredentials.UserName.Password = "mypassword";
Response.Write("Data from WCF Service: " + myClient.GetData(1));
Creo que necesito un poco de ayuda para vincular el CustomUsernamePasswordValidator en el servidor, ya que todavía tengo el mensaje '... no se pudo activar'. error.
Solución
¿Está obligado a usar el basicHttpBinding? Ese enlace es realmente solo para proporcionar soporte para implementaciones de WS-BasicProfile heredadas (es decir, ASMX). Si sus clientes también son .NET / WCF, recomendaría usar wsHttpBinding, que proporciona una gran cantidad de opciones de seguridad listas para usar. Puede usar certificados, nombre de usuario / contraseña, etc. con el transporte y / o seguridad de mensajes y no necesita escribir ninguna de las cosas de seguridad usted mismo. Sólo configure-and-go (CAG).
La información de la credencial de seguridad está disponible para el servicio a través del OperationContext, en caso de que necesite acceder directamente desde su código. Sin embargo, si su código necesita acceder a él, recomendaría escribir un comportamiento para extraer la información pertinente de OperationContext y colocarlo en una aplicación más específica para que no tenga que hacer referencia a System.ServiceModel en todos los lugares a los que necesita acceder información sobre OperationContext.