2012-04-05 9 views
6

Tengo un servicio wcf webhttp que usa autenticación de formularios para autenticar usuarios. Esto funciona bien si el ticket viene en la colección de cookies o en la url.Aumentar la autenticación de formularios para usar un encabezado http personalizado para el ticket

Pero ahora quiero enviar la cadena de los formularios auth ticket en un encabezado http personalizado y cambiar el módulo auth de formularios para buscar ese encabezado en lugar de la cookie.

Creo que debería ser fácil extender la autenticación de formularios para lograr esto, pero no pude encontrar ningún recurso de cómo hacerlo. Me puede apuntar en la dirección correcta ?

aquí es como mi flujo de autenticación funcionaría,

  1. Un cliente llama al método de autenticación con el nombre de usuario y pwd
  2. servicio devuelve la cadena vale cifrado
  3. El cliente envía la cadena billete recibido en un http encabezado con cada solicitud posterior
  4. Servicio comprueba el encabezado de autenticación y valida el ticket de autenticación
+0

han intentado descompilación el módulo de autenticación de formularios? Debería poder subclasificarlo y anular algunos de sus métodos. O tal vez solo escriba su propio nombre completo – cecilphillip

+0

¿Por qué le gustaría enviar el ticket en un encabezado personalizado en lugar de un encabezado estándar de Cookie? –

+0

Porque parece más agradable en un escenario API. Enviar cookies no parece natural para una API – Amila

Respuesta

3

El módulo FormAuthentication no es extensible, pero puede escribir su propia autenticación. Es muy simple:

autenticación (2): Llamada


var formsTicket = new FormsAuthenticationTicket(
    1, login, DateTime.Now, DateTime.Now.AddYears(1), persistent, String.Empty); 
var encryptedFormsTicket = FormsAuthentication.Encrypt(formsTicket); 
//return encryptedFormsTicket string to client 

servicio con el boleto adjunto (4):


var ticket = FormsAuthentication.Decrypt(encryptedFormsTicket) 
//extract authentication info from ticket: ticket.Name 
+0

De hecho, hice este método y funciona bien ... – Amila

1

No estoy seguro de que este sea el camino a seguir (en cuanto a la elegancia), pero ¿qué tal agregar un evento en global.asax.cs para Application BeginRequest y tomar la cadena del encabezado e insertar una cookie en la Solicitud usted mismo (Formularios) la autenticación debería recoger eso).

Algo así como:


protected void Application_BeginRequest() 
{ 
    // Your code here to read request header into cookieText variable 
    string cookieText = ReadCookieFromHeader(); 

    var cookieData = FormsAuthentication.Decrypt(cookieText); 

    if (!cookieData.Expired) 
    { 
     HttpContext.Current.Request.Cookies.Add(new HttpCookie(cookieData.Name, cookieText)); 
    } 
} 

Exención de responsabilidad: Tenga en cuenta que no he probado esto, simplemente tirar un posible enfoque a tu manera!

Cuestiones relacionadas