Omar Al Zabir beschreibt in seinem Buch "Building a Web 2.0 Portal with ASP.NET 3.5" eine interessante Alternative zum ASP.NET Logout Mechanismus über FormsAuthentication.SignOut. Letzteres löscht lediglich das Cookie .DBAUTH, was in vielen Fällen ausreichen mag. Wenn jedoch ein "anonymous identification provider" verwendet wird, werden zwei Cookies erstellt, .DBAUTH und .DBANON. Probleme können dann entstehen, wenn durch SignOut das Authentifizierungscookie gelöscht wird, das anonymous cookie jedoch noch vorhanden ist.
Um dieses Problem zu umgehen, schlägt Zabir die Verwendung eines LogOut Handlers vor, der alle Cookies im Zusammenhang mit dieser Website entfernt. Ein Handler bringt in diesem Fall weniger Overhead mit sich und generiert nur relativ wenig Code, wenn er zur Laufzeit kompiliert wird.
Codebeispiel
Logout.ashx, aufzurufen z.B. über
lnkLogout.NavigateUrl = "~/Logout.ashx";
<%@ WebHandler Language="C#" Class="Logout" %>
//when logging out remove all cookies related to the site
//instead of just removing the forms authentication cookie
using System;
using System.Web;
using System.Web.Security;
using System.Collections.Generic;
public class Logout : IHttpHandler
{
public void ProcessRequest (HttpContext context)
{
/// Expire all the cookies
List<string> cookiesToClear = new List<string>();
foreach (string cookieName in context.Request.Cookies)
{
HttpCookie cookie = context.Request.Cookies[cookieName];
cookiesToClear.Add(cookie.Name);
}
foreach (string name in cookiesToClear)
{
HttpCookie cookie = new HttpCookie(name, string.Empty);
cookie.Expires = DateTime.Today.AddYears(-1);
context.Response.Cookies.Set(cookie);
}
context.Response.Redirect"~/Default.aspx");
}
public bool IsReusable
{
get
{
return true;
}
}
}