Login único em vários domínios [fechado]


110

Nossa empresa tem vários domínios configurados com um site hospedado em cada um dos domínios. Neste momento, cada domínio possui sua própria autenticação que é feita por meio de cookies.

Quando alguém conectado a um domínio precisa acessar qualquer coisa do outro, o usuário precisa fazer login novamente usando credenciais diferentes no outro site, localizado no outro domínio.

Eu estava pensando em mudar para o logon único (SSO), para que esse incômodo possa ser eliminado. Eu apreciaria quaisquer ideias sobre como isso poderia ser alcançado, pois não tenho nenhuma experiência a esse respeito.

Obrigado.

Editar: Os sites são uma mistura de sites de internet (externos) e intranet (usados ​​internamente na empresa).


Isso soa como um trabalho para OpenID - mas permite apenas IDs de seu domínio de login.
Neall

2
@Will Esta pergunta pode não ser para este site na rede SE, mas é definitivamente construtiva .
Binar Web

@BinarWeb Os motivos de proximidade evoluíram desde 2008. Naquela época, essa era a escolha mais aplicável.

Respostas:


91

A solução SSO que implementei aqui funciona da seguinte maneira:

  1. Existe um domínio mestre, login.mydomain.com com o script master_login.php que gerencia os logins.
  2. Cada domínio de cliente possui o script client_login.php
  3. Todos os domínios têm um banco de dados de sessão de usuário compartilhado.
  4. Quando o domínio do cliente requer que o usuário esteja logado, ele redireciona para o domínio mestre (login.mydomain.com/master_login.php). Se o usuário não tiver feito login no master, ele solicitará autenticação do usuário (ou seja, exibir página de login). Depois que o usuário é autenticado, ele cria uma sessão em um banco de dados. Se o usuário já estiver autenticado, ele procura seu id de sessão no banco de dados.
  5. O domínio mestre retorna ao domínio do cliente (client.mydomain.com/client_login.php) passando o id da sessão.
  6. O domínio do cliente cria um cookie que armazena a id da sessão do mestre. O cliente pode descobrir o usuário conectado consultando o banco de dados compartilhado usando o id de sessão.

Notas:

  • O id de sessão é um identificador global único gerado com algoritmo de RFC 4122
  • O master_login.php só irá redirecionar para domínios em sua lista de permissões
  • O mestre e os clientes podem estar em domínios de nível superior diferentes. Por exemplo. client1.abc.com, client2.xyz.com, login.mydomain.com

Esta parece ser uma boa solução grom. O que você armazena na base de dados? É (session_id, username, hashed_password)?
Jon M

3
Como você lida com o caso de o login do domínio mestre.meudominio.com cair? O login é impossível nesse ponto?
jjxtra

3
Qualquer corpo produziu algum exemplo de código ou um repositório github?
Joshua F. Rountree

Isso é o que quase todos os protocolos SSO (por exemplo, SAML) especificam, mas com mais segurança contra ataques de repetição e assim.
cweiske de

2
E se eles não compartilharem o banco de dados do usuário? Cada aplicativo da web parceiro tem sua própria base de usuários. Como encontramos isso?
stickedoverflow

33

Não reinvente a roda. Existem vários pacotes de SSO de domínio cruzado de código aberto, como JOSSO, OpenSSO, CAS, Shibboleth e outros. Se você estiver usando a tecnologia Microsoft (IIS, AD), poderá usar a federação da Microsoft (ADFS).


4
Com certeza - eu já vi muitas pessoas testando suas próprias soluções de segurança apenas para descobrir que elas são vulneráveis ​​a replay, XSRF ou outros ataques

5
+1 Você [quase] nunca deve reinventar a roda de segurança.
Mark E. Haase

13
OpenSSO está morto e JOSSO e CAS são soluções JAVA. Apenas um FYI
OneHoopyFrood

15

Quão diferentes são os nomes de host?

Esses hosts podem compartilhar cookies:

  • mail.xyz.com
  • www.xyz.com
  • logon.xyz.com

Mas estes não podem:

  • abc.com
  • xyz.com
  • www.tre.com

No primeiro caso, você pode encontrar uma solução baseada em cookies. Pense em GUID e uma tabela de sessão de banco de dados.


2

Se você usar o Active Directory, poderá fazer com que cada aplicativo use AD para autenticação, o login pode ser perfeito.

Caso contrário, se os aplicativos puderem se comunicar entre si nos bastidores, você pode usar sessionids e ter um aplicativo gerenciando a geração de id atendendo a todos os outros aplicativos.


2
o usuário ainda não precisa inserir o nome de usuário e a senha em dominio1.com e dominio2.com e dominio3.com ao acessar esses sites pela primeira vez para esta sessão?
HaBo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.