Imagine que você possui uma solução que contém várias aplicações web rodando no seu próprio domínio (www.clienteA.com.br ou www.clienteZ.org.br) e que precisam usar um único endereço para autenticação como login.dominio.com. A princípo os clientes precisam redirecionar seus clientes para login.dominio.com quando quiserem se autenticar e em seguida login.dominio.com leva os clientes de volta.
Mas há um pequeno problema no redirecionamento dos nossos clientes para a página de login quando usamos FormsAuthentication. A variável ReturnUrl que contém o endereço de retorno é montada relativamente ao cliente. E com isso não temos a informação para trazer o cliente de volta a url inicial.
A princípio não há uma propriedade no FormsAuthentication que defina que a variável ReturnUrl precisa ser montada com a URL completa. Mas não se desespere! Eu fiz uma busca por soluções a esse problema, e encontrei uma forma bastante simples.
Basta que você trate a variável ReturnUrl no evento Application_EndRequest. Abaixo o código que encontrei no blog do David Findley:
protected void Application_EndRequest(object sender, EventArgs e) { string redirectUrl = this.Response.RedirectLocation; if (!string.IsNullOrEmpty(redirectUrl)) { this.Response.RedirectLocation = Regex.Replace(redirectUrl, "ReturnUrl=(?'url'.*)", delegate(Match m) { string url = HttpUtility.UrlDecode(m.Groups["url"].Value); Uri u = new Uri(this.Request.Url, url); return string.Format("ReturnUrl={0}", HttpUtility.UrlEncode(u.ToString())); }, RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture); } }
Com o código acima sua aplicação de login terá a url completa para enviar os usuários de volta.