Pregunta

Tengo una aplicación principal de asp.net, que está escrita en asp.net 1.1.Debajo de la aplicación se ejecutan varias aplicaciones 2.0.Para cerrar completamente la sesión de un usuario, ¿puedo simplemente cerrar sesión en la aplicación 1.1 con FormsAuthentication.SignOut o es más complicado que eso?

¿Fue útil?

Solución

Lo que busca hacer se llama Inicio de sesión único y Cierre de sesión único.Existen diferencias según cómo haya configurado las aplicaciones.Intentaré aclarar dónde entran en juego esas diferencias.

Para implementar el inicio de sesión único y el cierre de sesión único, debe hacer que los atributos de nombre de cookie, protección y ruta sean los mismos entre todas las aplicaciones.

<authentication mode="Forms">
    <forms name=".cookiename"
           loginUrl="~/Login.aspx" 
           timeout="30" 
           path="/" />
</authentication>

A continuación, debe agregar las claves de la máquina y deben ser las mismas en todas sus aplicaciones.

<machineKey validationKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902"
            encryptionKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902F8D923AC"
            validation="SHA1" />

¿Está utilizando dominios de segundo o tercer nivel para las aplicaciones?Si es así, tendrás que hacer un poco más añadiendo el dominio a la cookie:

protected void Login(string userName, string password)
{
    System.Web.HttpCookie cookie = FormsAuthentication.GetAuthCookie(userName, False);
    cookie.Domain = "domain1.com";
    cookie.Expires = DateTime.Now.AddDays(30);
    Response.AppendCookie(cookie);
}

Ahora, para realizar el cierre de sesión único, es posible que llamar a FormsAuthentication.SignOut no sea suficiente.La mejor opción es establecer la caducidad de las cookies en una fecha pasada.Esto garantizará que la cookie no se vuelva a utilizar para la autenticación.

protected void Logout(string userName)
{
    System.Web.HttpCookie cookie = FormsAuthentication.GetAuthCookie(userName, False);
    cookie.Domain = "domain1.com";
    cookie.Expires = DateTime.Now.AddDays(-1);
    Response.AppendCookie(cookie);
}

Estoy tomando en consideración que está utilizando la misma base de datos para todas las aplicaciones.Si las aplicaciones utilizan una base de datos separada para el registro y la autenticación, entonces necesitaremos hacer algo más.Sólo déjame saber si este es el caso.De lo contrario, esto debería funcionar para usted.

Otros consejos

Podría ser más fácil si tuviera un almacén de sesiones central para todas sus aplicaciones.Luego puede configurar la sesión como nula en un solo lugar.

Esto funcionó para mí:

En el evento de cierre de sesión, en lugar del método FormsAuthentication.GetAuthCookie, utilice la colección de cookies en el objeto Solicitud como se muestra a continuación:

HttpCookie cookie = Request.Cookies.Get(otherSiteCookieName);
cookie.Expires = DateTime.Now.AddDays(-1);
HttpContext.Current.Response.Cookies.Add(cookie);

Por supuesto, esto requiere que conozca el nombre de la cookie de los sitios en los que desea que se cierre la sesión del usuario, lo que sin embargo no será un problema si utiliza la misma cookie en todas las aplicaciones web.

Prefiero usar web.config

<authentication mode="Forms">
    <forms domain=".tv.loc" loginUrl="~/signin" timeout="2880" name="auth" />
</authentication>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top