Autenticação Single Sign-On em .NET

Em .NET é fácil partilhar o cookie de autenticação em vários sites quando se usa Forms Based Authentication, mesmo que as aplicações estejam em servidores diferentes. Requer algumas alterações no web.config e/ou no código de autenticação.

As aplicações têm de usar o mesmo domínio base

O primeiro requisito é que todas as aplicações precisam de partilhar o mesmo domínio base. Isto é necessário para que o cookie seja acessível às aplicações. Alguns exemplos:

  • Funciona:
    • somesite.com
    • other.somesite.com
    • another.somesite.com
  • Não funciona:
    • somesite.com
    • othersite.com

Isto nem sempre é possível para aplicações já existentes, mas infelizmente é necessário para conseguir usar a funcionalidade single sign-on.

Actualizar as definições no web.config

O segundo passo é garantir que a configuração dos elementos authentication e machineKey no web.config seja igual para todas as aplicações. E.g.:

<authentication mode="Forms">
 <forms
  name=".LOGINFORM"
  path="/"
  defaultUrl="http://www.somesite.com/Default.aspx"
  loginUrl="http://www.somesite.com/Login.aspx"
  enableCrossAppRedirects="true"
  domain="somesite.com" />
</authentication>
<machineKey
 validationKey="{replace with your validation key}"
 decryptionKey="{replace with your decryption key}"
 validation="SHA1" />

É necessário que estes valores sejam iguais para todas as aplicações. Todas têm de ter a mesma machine key, o mesmo nome do cookie, a mesma página de login, etc., ou não irá funcionar.

Não ponham a validationKey e a decryptionKey em AutoGenerate - têm de ter uma chave específica e igual para todos os sites.

Actualizar o cookie programaticamente

Em alternativa a especificar o domínio do cookie no web.config, podem actualizar o cookie programaticamente. É importante que seja criado o cookie correcto.

Para sign in:

// sign in
FormsAuthentication.SetAuthCookie(username, false);
HttpCookie cookie = FormsAuthentication.GetAuthCookie(username, false);
cookie.Domain = "somesite.com";
HttpContext.Current.Response.AppendCookie(cookie);

Para sign out é necessário expirar o cookie, senão o utilizador irá continuar ligado:

// sign out
FormsAuthentication.SignOut();
HttpCookie cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
cookie.Domain = "somesite.com";
cookie.Expires = DateTime.Now.AddDays(-1);
HttpContext.Current.Response.AppendCookie(cookie);

Por questões de brevidade, deixei de fora try/catch e restrições de segurança.

Conclusão

É isto! É fácil de configurar assim que sabemos as restrições.

Podem aceder à informação do utilizador como fariam normalmente numa aplicação, e.g. usando User.Identity no contexto de uma página ou com HttpContext.Current.User.Identity.

Nuno Freitas
Publicado por Nuno Freitas em 09 dezembro, 2013

Artigos relacionados