Dicas: Login e Logout restrito a pastas da Web Application
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)
10-03-10 16:20:33, 