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.