2011-08-22 17 views
8

Aquí una característica interesante de ASP.NET FormsAuthentication explicado en esta SO respuesta: How do you pass an authenticated session between app domainsEnableCrossAppRedirects: ¿Dónde se documenta la característica de dominio cruzado?

Breve resumen; puede crear dos sitios web ASP.NET con las mismas claves de cifrado. WebsiteA puede crear un token formsauth y redirigir a WebsiteB con el token en la cadena de consulta (o cuerpo POST). Encienda EnableCrossAppRedirects en WebsiteB y ASP.NET detecta el token y crea la cookie formsauth. En código:

FormsAuthentication.RedirectFromLoginPage("alice", true); 
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket("Alice", true, 30); 
string encrypted = FormsAuthentication.Encrypt(ticket); 
Response.Redirect("http://siteb.dev/Secure/WebForm1.aspx?" + FormsAuthentication.FormsCookieName + "=" + encrypted); 

suena como una gran característica, pero donde se documenta? Sentiría un bit intranquilo usando una característica no documentada.

Dónde he buscado, sin mencionar esta función en ninguna de las referencias de MSDN. Pensé que tal vez RedirectFromLoginPage generaría una redirección como mi código anterior, pero no es así.

Respuesta

14

Después de examinar el reflector no es una característica (un poco documentada) de formas Autenticación Cuando se habilita EnableCrossAppRedirects, NET buscará, además de buscar la cookie de autenticación, extraer la "cookie" de autenticación de formularios de la publicación de formulario o de la cadena de consulta. Este código está incrustado en la clase FormsAuthentication en el método ExtractTicketFromCookie, donde se puede ver claramente tratando de encontrar la cookie de autenticación en los datos de solicitud.

if (FormsAuthentication.EnableCrossAppRedirects) 
{ 
    text = context.Request.QueryString[name]; 
    if (text != null && text.Length > 1) 
    { 
     if (!cookielessTicket && FormsAuthentication.CookieMode == HttpCookieMode.AutoDetect) 
     { 
      cookielessTicket = CookielessHelperClass.UseCookieless(context, true, FormsAuthentication.CookieMode); 
     } 
     try 
     { 
      formsAuthenticationTicket = FormsAuthentication.Decrypt(text); 
     } 
     catch 
     { 
      flag2 = true; 
     } 
     if (formsAuthenticationTicket == null) 
     { 
      flag2 = true; 
     } 
    } 
    if (formsAuthenticationTicket == null || formsAuthenticationTicket.Expired) 
    { 
     text = context.Request.Form[name]; 
     if (text != null && text.Length > 1) 
     { 
      if (!cookielessTicket && FormsAuthentication.CookieMode == HttpCookieMode.AutoDetect) 
      { 
       cookielessTicket = CookielessHelperClass.UseCookieless(context, true, FormsAuthentication.CookieMode); 
      } 
      try 
      { 
       formsAuthenticationTicket = FormsAuthentication.Decrypt(text); 
      } 
      catch 
      { 
       flag2 = true; 
      } 
      if (formsAuthenticationTicket == null) 
      { 
       flag2 = true; 
      } 
     } 
    } 
} 

Por lo tanto si se habilita EnableCrossAppRedirects en ambas aplicaciones, a continuación, la primera aplicación está autorizada para redirigir al sitio externo, y la segunda aplicación leerá automáticamente en la cookie de autenticación de la petición. Solo necesita diseñarlo para que la URL de inicio de sesión devuelva los datos de la cookie o los envíe a la cadena de consulta. También debe asegurarse de que las teclas de la máquina estén sincronizadas o que la cookie esté cifrada con la clave del equipo de aplicaciones externas (en la primera aplicación). Parece que por defecto .NET enviará la cookie de autenticación cifrada en la cadena de consulta para usted y asume que las claves de su máquina están sincronizadas (consulte la cita de MSDN a continuación).

Aquí hay algunos más info on MSDN.

Si la propiedad CookiesSupported es cierto, y, o bien la variable ReturnUrl está dentro de la aplicación actual o la propiedad EnableCrossAppRedirects es cierto, entonces el método RedirectFromLoginPage emite un vale de autenticación y lo coloca en la cookie predeterminado utilizando el método SetAuthCookie.

Si CookiesSupported es falso y la ruta de redireccionamiento es a una URL en la aplicación actual , el ticket se emite como parte de la URL de redirección. Si CookiesSupported es falsa, EnableCrossAppRedirects es verdad, y la URL de redirección no se refiere a una página dentro de la aplicación actual, el método RedirectFromLoginPage emite un vale de autenticación y lo coloca en la propiedad de cadena de consulta.

Existe una gran advertencia sobre el impacto en la seguridad. EnableCrossAppRedirects es una configuración de seguridad que impide que los controles de inicio de sesión de ASP.NET se redireccionen a una URL de devolución externa (otra aplicación web). Con esta configuración habilitada, puede aprovecharse en algunas formas de ataque: un usuario se envía a la página de inicio de sesión oficial, pero al iniciar sesión se le redirige a una aplicación diferente que puede creer que es la misma. Es por eso que está deshabilitado por defecto.

Una forma de ayudar a mitigar este cuando se habilita la función es la siguiente:

para mejorar la seguridad cuando se utiliza entre aplicaciones redirige, debe reemplazar el método RedirectFromLoginPage para permitir redirecciones sólo para sitios Web aprobados .

también es necesario para garantizar la solicitud de redirección se sirve a través de SSL para proteger la "cookie" en tránsito, como cualquier persona que intercepte sería capaz de hacerse con el control de la cuenta.

+0

Lo siento revisó mi respuesta, hay una función oculta de .NET que recogerá automáticamente la cookie de autenticación de una publicación de formulario o cadena de consulta. ¡Acabo de aprender algo nuevo! – TheCodeKing

+0

¡Gran respuesta! Así que estoy subvirtiendo una función de autenticación 'no cookies'. Re peligros de seguridad: no estoy usando RedirectFromLoginPage, así que controlo a dónde se redirige al usuario. Redirigir sobre SSL: el token en el POST/querystring no está menos protegido que el formsauth cookie, la apuesta más segura es colocar todo el sitio web a través de SSL. – russau

+0

BTW: ¿por qué la wiki de la comunidad? ¿Aún recibirás la recompensa cuando yo lo conceda? – russau

Cuestiones relacionadas