Com certeza vocês já viram aplicativos na internet que são criados apenas configurando alguns dados e você tem uma nova instância do serviço. Nos bastidores existe apenas uma aplicação instalada e essa aplicação interpreta a URL para identificar o cliente.

Recentemente eu criei um aplicativo semelhante. Vejam a descrição do requisito:

Ter uma única aplicação ASP.NET que responda a requisições aos endereços meudominio.com/umcliente e meudominio.com/outrocliente, além disso um usuário autenticado no primeiro endereço não deve ter acesso aos recursos do outro cliente.

Vejam que o requisito pede um aplicativo instânciável (ok! fiz isso usando routing). O problema estava em autenticar o usuário apenas na sua pasta. E eu não queria ter que verificar em cada requisição se o usuário está autorizado ou não a acessar o recurso. O meu desejo era ter uma solução desacoplada.

Vamos estão ao código usado para autenticar:

public static void CreateTicket(string username, string host, string application, bool isPersistent, string userData, DateTime expiration)
{
FormsAuthentication.Initialize();

//
// Cria o ticket de autenticação
//
var ticket = new FormsAuthenticationTicket(1, username, DateTime.Now, expiration, isPersistent, userData);

//
// Criptografa o ticket
//
string hash = FormsAuthentication.Encrypt(ticket);

//
// Guarda o cookie no navegador de acordo com as opções do usuário
//
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);

cookie.Domain = host;

if (!string.IsNullOrEmpty(application))
{
cookie.Path = "/" + application + "/";
}

if (ticket.IsPersistent)
cookie.Expires = ticket.Expiration;

HttpContext.Current.Response.Cookies.Add(cookie);
}

Observe que eu defino no cookie as propriedades Domain e Path. E eu preciso definir essas propriedades para que o navegador não compartilhe o cookie com as aplicações que estão nas outras pastas.

O signout também tem as suas sutilezas, pois o método FormsAuthentication.Signout() não funciona nesses casos. Você precisa fazer um método assim:

private void Signout(string host, string application)
{
System.Web.HttpCookie cookie;

cookie = FormsAuthentication.GetAuthCookie(Thread.CurrentPrincipal.Identity.Name, false);
cookie.Domain = host;

if (!string.IsNullOrEmpty(application))
{
cookie.Path = "/" + application + "/";
}

cookie.Expires = DateTime.Now.AddDays(-1);
Response.AppendCookie(cookie);

}

Se você sentiu interesse em saber um pouco mais, visite o artigo Single Sign On across multiple ASP.NET applications no Developer Corner.