Dicas: Login e Logout restrito a pastas da Web Application

por Alexsandro Nunes Lacerda Email

 

Por Ivan Paulovich

 

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çosmeudominio.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, boolisPersistent, 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);

}


 

Endereço de trackback para este post

Trackback URL (clique direito e copie atalho/localização do link)

Sem feedback para esse post ainda

Deixe seu comentário


Seu endereço de e-mail não será revelado nesse site.

Sua URL será exibida.
PobreExcelente
(Quebras de linha se tornam <br />)
(Nome, e-mail & website)
(Permitir que usuários o contatem através de um formulário eletrônico (seu e-mail não será exibido.))