2010-07-18 10 views
7

Tengo un servicio web WCF que expone varios métodos comerciales. También tengo dos clientes: una GUI de asp.net y una aplicación de migración de datos que se conectan al backend wcf para invocar varias transacciones comerciales.Identificación de WCF Client ID

Necesito mi backend para poder identificar y distinguir entre qué cliente de wcf ha realizado una llamada a alguna lógica de variante.

¿Hay alguna manera de que mi servicio WCF pueda identificar a los clientes conectados a él? ¿También hay una forma de utilizar una clave firmada para evitar que un cliente falsifique su identidad?

+0

¿Tiene un escenario de ejemplo de una operación de tal manera que debe comportarse de manera diferente dependiendo de ¿llamador? Es posible que desee considerar la posibilidad de aplicar autenticación y autorización en lugar de tener operaciones que se comporten de manera diferente según la persona que llama. – Alex

+0

Sí ... tenemos un par de escenarios que deben manejarse de manera diferente en el back-end, dependiendo de qué cliente de WCF se esté conectando. – Hady

Respuesta

14

Puede resolverlo mediante un encabezado personalizado.

Puede agregar un encabezado personalizado como parte del punto final en el archivo de configuración de la aplicación cliente. Luego, haría diferente el encabezado personalizado de cada cliente. Por ejemplo, en la versión de ASP.NET:

 <endpoint 
      name="basicHttpEndpoint" 
      address="http://localhost:8972" 
      binding="basicHttpBinding" 
      contract="MySeriveContractLib.IMyService" 
      > 
      <headers> 
       <ClientIdentification>ASP_Client</ClientIdentification> 
      </headers> 
     </endpoint> 

continuación, el servicio puede comprobar el valor de la cabecera de este modo:

public void MyServiceMethod() 
{ 
    var opContext = OperationContext.Current; 
    var requestContext = opContext.RequestContext; 
    var headers = requestContext.RequestMessage.Headers; 
    int headerIndex = headers.FindHeader("ClientIdentification", ""); 
    var clientString = headers.GetHeader<string>(headerIndex); 
    if clientString=="ASP_Client" 
    { 
     // ... 
    } 
    else 
    { 
     // ... 
    } 
} 
3

Para identificar el tipo de llamante (ASP.NET vs. WInforms o lo que sea), probablemente necesite agregar un encabezado personalizado a sus mensajes WCF - no hay manera de que el servicio sepa nada sobre el cliente llamante a menos que sea parte del mensaje o los encabezados enviados. Para esto, su mejor opción es escribir un inspector de mensajes WCF, y este blog post here le mostrará cómo hacerlo.

En cuanto a la seguridad, depende de su entorno. En una LAN corporativa detrás de un firewall: use las credenciales de Windows. Si está "al aire libre", su mejor opción sería instalar certificados digitales en los clientes para verificar su identidad.

WCF Guru Juval Löwy tiene un muy buen artículo en MSDN Magazine, Declarative WCF Security, que describe cinco escenarios de seguridad comunes en WCF y cómo implementarlos. Lectura altamente recomendada

+0

Es el 'Inspector de mensajes 'un equivalente uno a uno a la respuesta de Andrew; simplemente una forma diferente de hacer lo mismo? ¿O hay algún valor en usar el Inspector? – OmegaMan

Cuestiones relacionadas