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
.