Pregunta

Tengo un sitio web que se comunica con un servicio web remoto WCF. Ambos utilizan el mismo proveedor FormsAuthentication personalizado. Me gustaría para autenticarse con el servicio WCF hacerse pasar por el usuario que ha iniciado sesión en el sitio. Ya lo he hecho esto de forma manual, utilizando las credenciales del cliente UserName pero necesito saber la contraseña de 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:

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

Pero lo que realmente quiero es pasar la cookie FormsAuthentication directamente, porque no desea almacenar la contraseña de usuario.

¿Alguna idea?

¿Fue útil?

Solución

Parece que usted está buscando la href="http://msdn.microsoft.com/en-us/library/bb386582.aspx" rel="nofollow noreferrer"> Windows Communication Service Foundation .

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 de WCF no añade mucho a este escenario.

No he hecho esto entre WCF y ASP.NET, las aplicaciones ASP.NET sin embargo he configurados para compartir los usuarios autenticados formas, tal vez pueda ayudar de alguna manera.

Para asegurar que ambas aplicaciones se pueden cifrar / descifrar las formas cookie de autenticación de la misma manera que debiera configurar el elemento <machineKey> para ambas aplicaciones (en Web.config o Machine.config dependiendo de si se quiere hacer esto a pie de máquina o aplicación). Usted debe buscar en los atributos validation, validationKey, decryption y decryptionKey.

Asegúrese de que sus elementos <forms> en ambos archivos web.config se configuran de manera similar. Específicamente la name, atributos 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" ... />

Es probable que sea el poco complicado Pasando la cookie al servicio WCF. No estoy muy experimentado con WCF, por lo he adaptado código de 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

<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 ni idea de si algo de esto iba a funcionar, pero encantaría saber si lo hace!

Otros consejos

Es bastante sencillo de hacer si aloja el servicio WCF dentro del sitio de IIS autenticado.

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

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

A continuación, decorar cada servicio que desea aceptar la cookie con la siguiente

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

Ahora el objeto HttpContext.Current.User.Identity se rellenará correctamente y también se puede utilizar demandas PrinciplePermission para limitar el acceso de papel o para usuarios particulares.

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