asp.net - Pasar la cookie FormsAuthentication a un servicio WCF
forms-authentication wcf-security (2)
Es lo suficientemente simple de hacer si aloja el servicio WCF dentro del sitio autenticado de IIS.
Habilite la compatibilidad agregando lo siguiente a su sección system.ServiceModel en su web.config
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
Luego decora cada servicio que desees para aceptar la cookie con los siguientes
[AspNetCompatibilityRequirements(
RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
Ahora 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.
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. Entonces, lo que funciona tan pedo es esto: un usuario autenticado hace una solicitud, creo un cliente de servicio y establezco 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 quiero almacenar la contraseña del usuario.
¿Algunas ideas?
Parece que está buscando el Servicio de Autenticación de Windows Communication Foundation .
EDITAR:
Después de volver a leer la pregunta con más cuidado (y después del comentario de Ariel) me gustaría retractarme de 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 usuarios autenticados por formularios, quizás pueda ayudar de alguna manera.
Para garantizar que ambas aplicaciones puedan cifrar / descifrar la cookie de autenticación de formularios de la misma manera, debe configurar el elemento <machineKey>
para ambas aplicaciones (en web.config o machine.config dependiendo de si desea hacer esto en la máquina o aplicación nivel). Debería ver los atributos de validation
, validationKey
decryption
, decryption
y decryptionKey
clave.
Asegúrese de que sus elementos <forms>
en ambos archivos web.config estén configurados de manera similar. Específicamente los atributos de name
, path
y domain
.
Es probable que esto solo se aplique a las cookies pasadas a / desde un navegador web (pero pueden ser útiles en este caso): para permitir que las cookies pasen entre los sitios web www.foo.com y bar.foo.com , debe configurar los forms
elemento de la siguiente manera para permitir que las cookies se establezcan en un sitio y pasen con éxito al otro:
<forms ... domain=".foo.com" ... />
Pasar la cookie al servicio WCF es probable que sea un poco complicado. No tengo mucha experiencia con WCF, así que he adaptado el 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 aloja WCF dentro de IIS (y no autohospedaje), puede pasar la solicitud WCF a través de la interconexión de procesamiento de ASP.NET configurando
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" ... />
</system.serviceModel>
Si tiene alojamiento propio, puede examinar los encabezados de solicitud utilizando las propiedades del mensaje entrante en OperationContext.Current.IncomingMessageProperties
y obtener el valor de la cookie de autenticación de formularios y descifrarlo utilizando FormsAuthentication.Decrypt(string)
.
No tengo idea de si algo de esto funcionaría, pero me encantaría saber si funciona.