2009-07-06 60 views
11

Tengo un sitio web que habla con un servicio web remoto de WCF. Ambos usan el mismo proveedor personalizado de FormsAuthentication. Me gustaría autenticarme con el servicio WCF haciéndose pasar por el usuario que está conectado actualmente en el sitio. Ya lo hice manualmente, usando las credenciales del nombre de usuario pero necesito conocer la contraseña del usuario. Por lo tanto, lo que funciona de manera pedo es la siguiente: un usuario autenticado hace una petición, se crea un cliente de servicio y establecer sus credenciales:Pasando una cookie FormsAuthentication a un servicio de WCF

serviceClient.ClientCredentials.UserName.UserName = username; 
serviceClient.ClientCredentials.UserName.Password = password; 

Pero lo que realmente quiero es pasar la cookie FormsAuthentication directamente, porque Don No quiero almacenar la contraseña del usuario.

¿Alguna idea?

+0

Hola Ariel, ¿cómo te hiciste con esta? Conozco a alguien con problemas similares. –

Respuesta

13

Parece que está buscando Windows Communication Foundation Authentication Service.

EDIT:

Después de volver a leer la pregunta con más cuidado (y después el comentario de Ariel) Me gustaría retraer la sugerencia anterior. El Servicio de Autenticación WCF no agregará mucho a este escenario.

No he hecho esto entre WCF y ASP.NET; sin embargo, he configurado aplicaciones ASP.NET para compartir formularios de usuarios autenticados, quizás pueda ayudar de alguna manera.

Para asegurar que ambas aplicaciones puedan encriptar/desencriptar la cookie de autenticación de formularios de la misma forma que debería configure the <machineKey> element para ambas aplicaciones (en web.config o machine.config dependiendo de si desea hacer esto en la máquina o en el nivel de aplicación)) Debería mirar los atributos validation, validationKey, decryption y decryptionKey.

Asegúrese de que sus elementos <forms> en ambos archivos web.config estén configurados de manera similar. Específicamente los atributos name, path y domain.

Es probable que esto sólo se aplica a las cookies se transfiere a/desde un navegador web (pero puede ser útil en este caso): Para permitir cookies para pasar entre los sitios web www.foo.com y bar.foo .com podrá configurar el elemento forms de la siguiente manera para permitir que las cookies se establecen en un sitio y con éxito pasar a la otra:

<forms ... domain=".foo.com" ... /> 

Pasando la cookie al servicio WCF es probable que sea el poco complicado. No estoy muy experimentado con WCF, por lo I've adapted code from kennyw.com:

HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty(); 
httpRequestProperty.Headers.Add(HttpRequestHeader.Cookie, "<Forms Authentication Cookie>"); 

using (OperationContextScope scope = new OperationContextScope(serviceClient.InnerChannel)) 
{ 
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty; 
    serviceClient.MethodName(); 
} 

Si usted es anfitrión de WCF dentro de IIS (y no autoalojamiento) se puede pasar la solicitud WCF a través de la canalización de procesamiento de ASP.NET mediante el establecimiento de

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" ... /> 
</system.serviceModel> 

Si usted es independiente de alojamiento que podría examinar las cabeceras de petición utilizando las propiedades del mensaje entrante en OperationContext.Current.IncomingMessageProperties y obtener el valor de la cookie de autenticación de formularios y descifrar usando FormsAuthentication.Decrypt(string).

No tengo idea de si algo de esto funcionaría, pero me encantaría saber si lo hace.

+0

No veo cómo el Servicio de Autenticación podría ayudar. Mi situación es la siguiente: USER -> Sitio web A -> WCF Service B alojado en otro lugar El usuario inicia sesión en A, A realiza una llamada a B utilizando las credenciales de usuario. ¿Dónde agregaría el servicio de Autenticación? –

+0

Hola Ariel. Lamento haber intentado responder demasiado rápido sin realmente haber leído tu pregunta. Lo editaré con una actualización. – dariom

+0

Gracias por la sugerencia, lo intentaré y compartiré los resultados aquí. –

4

Es lo suficientemente simple de hacer si aloja el servicio WCF dentro del sitio autenticado de IIS.

Habilitar compatibilidad añadiendo lo siguiente a la sección de system.serviceModel en su web.config

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel> 

luego decorar cada servicio que desea aceptar la cookie con la siguiente

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

Ahora el El objeto HttpContext.Current.User.Identity se completará correctamente y también puede usar las demandas de PrinciplePermission para limitar el acceso por rol o para usuarios particulares.

+0

Bueno, ese es el problema, no puedo usar el mismo IIS. Un requisito para el sistema que estoy construyendo era alojar el sitio web y el servicio en máquinas separadas. Estoy considerando usar un token compartido, pero el uso de Forms fue la solución más simple para implementar proveniente de ASP.net. –

+0

¡Ah sod! ¿Al menos puedes ponerlos en el mismo nombre de dominio? De ser así, puede establecer los formularios auth ámbito de cookies y compartirlo de esa manera. – blowdart

+0

Creo que sí, la aplicación se alojará en una intranet bajo un único dominio raíz. También podemos configurar teclas de máquina idénticas, pero tenga en cuenta que el usuario está accediendo al sitio web y el sitio web utiliza el WCF como una fuente de datos que se hace pasar por el usuario. Funciona bien con la Autenticación de Windows, pero pasar la cookie FormsAuthentication es una historia diferente. Probaré la sugerencia de dariom (o cualquier otra si está disponible). –

Cuestiones relacionadas