Pergunta

Eu vejo iframe / truque p3p é um dos mais populares ao redor, mas eu pessoalmente não gosto, porque o JavaScript + campos ocultos + quadro realmente fazer com que pareça um trabalho hack. Eu também vir através de uma abordagem mestre-escravo usando o serviço web para se comunicar ( http: // www. 15seconds.com/issue/971108.htm ) e parece melhor porque é transparente para o usuário e é robusto contra diferentes navegadores.

Existe algum melhores abordagens, e quais são os prós e contras de cada um?

Foi útil?

Solução

A minha abordagem designa um domínio como o domínio 'central' e quaisquer outros como domínios de 'satélites'.

Quando alguém clica em um 'sinal em' link (ou apresenta um cookie de login persistente), o sinal em forma, em última instância envia seus dados para um URL que está no domínio central, juntamente com um elemento de formulário oculto dizendo que domínio ele veio a partir de (apenas por conveniência, para que o usuário é redirecionado de volta depois).

Esta página no domínio central então começa a definir um cookie de sessão (se o login foi bem) e redirecionar de volta para qualquer domínio que o usuário logado a partir, com uma especialmente gerado token no URL que é exclusivo para essa sessão.

A página na URL por satélite, em seguida, verifica se token para ver se ele faz correspondem a um token que foi gerado para uma sessão, e em caso afirmativo, ele redireciona para si mesmo sem o token, e define um cookie local. Agora esse domínio satélite tem um cookie de sessão também. Esse redirecionamento limpa o token do URL, de modo que é improvável que o usuário ou qualquer rastreador irá gravar a URL contendo esse símbolo (embora se o fizessem, não deve assunto, o token pode ser um token de uso único).

Agora, o usuário tem um cookie de sessão, tanto no domínio central eo domínio satélite. Mas e se eles visitam outro satélite? Bem, normalmente, eles aparecem para o satélite como não autenticado.

No entanto, ao longo da minha aplicação, sempre que um usuário está em uma sessão válida, todos os links para páginas sobre os outros domínios de satélite tem um? S ou & S anexados a eles. I reservar esta consulta string 's' para significar "verificar com o servidor central, porque nós consideramos este usuário tem uma sessão". Ou seja, nenhum ID de token ou sessão é mostrado em qualquer página HTML, apenas a letra 's' que não pode identificar alguém.

A URL receber tal 's' tag consulta, se não houver uma sessão válida ainda, fazer um redirecionamento para o domínio central dizendo "você pode me dizer quem é este?" colocando algo na cadeia de consulta.

Quando o usuário chega ao servidor central, se eles são autenticados há servidor central vai simplesmente receber o seu cookie de sessão. Ela irá então enviar a volta do usuário para o satélite com um outro uso único token, que o satélite irá tratar apenas como um satélite seria Após o login (veja acima). Ou seja, o satélite irá agora configurar um cookie de sessão em que domínio e redirecionamento para si para remover o token da string de consulta.

A minha solução funciona sem roteiro, ou suporte iframe. Ele requer '? S' para ser adicionado a qualquer URL entre domínios onde o usuário pode ainda não têm um cookie nesse URL. Eu achava que de uma maneira de contornar isso: quando o primeiro usuário faz login, configurar uma cadeia de redirecionamentos em torno de cada domínio, definir um cookie de sessão em cada um. A única razão pela qual eu não implementaram isso é que seria complicado em que você precisa ser capaz de ter uma ordem estabelecida que esses redirecionamentos iria acontecer e quando parar, e iria impedi-lo de se expandir além de 15 domínios ou assim (muitos mais e você tornar-se perigosamente perto do 'limite de redirecionamento' de muitos navegadores e proxies).

Outras dicas

Isso é uma boa solução se você tem controle completo de toda a infra-estrutura domínios. Na minha situação eu só tenho controle do cliente (javascript / html) em um, e-controle total sobre o outro, portanto eu preciso usar o método iframe / p3p, que suga:. (

O exemplo neste artigo parece suspeito para mim, porque basicamente você redirecionar para uma URL que, por sua vez, passa variáveis ??para voltar ao seu domínio em uma querystring.

No exemplo, isso significaria que um utilizador mal intencionado poderia simplesmente navegar para http: //slave.com/return.asp?Return=blah&UID=123 " e estar conectado on slave.com como usuário 123.

Estou faltando alguma coisa, ou é bem conhecido que esta técnica é inseguro e não deve ser usado para, bem, coisas como esse exemplo sugere (que passam em torno de ID de usuário, presumivelmente para fazer uma identidade portátil).

@thomasrutter

Você pode evitar ter que gerenciar todos os links externos em satélites (via acrescentando "s" para querystring), fazendo uma chamada ajax para verificar o domínio 'central' para auth estado no carregamento da página. Você poderia evitar chamadas redundantes (no carregamento da página subseqüentes), fazendo apenas um por sessão.

Seria sem dúvida melhor para fazer a solicitação do lado do servidor de verificação de autenticação antes do carregamento da página de modo que (a) você tem acesso mais eficiente a sessão, e (b) você vai saber sobre a página prestar ou não o usuário é logado (e exibir o conteúdo em conformidade).

Nós usamos encadeamento biscoito, mas não é uma boa solução, uma vez que quebra quando um dos domínios não funciona para o usuário (devido a filtragem / firewalls etc.). As técnicas mais recentes (incluindo o seu), apenas quebrar quando o servidor "mestre" que distribui os bolinhos / gere logins breaks.

Note que o seu return.asp pode ser abusado para redirecionar para qualquer site (veja este por exemplo).

Ok I parecem ter encontrado uma solução, você pode criar uma tag script que carrega o src do domínio que você deseja set / get cookies ... única safari até agora parece não ser capaz de cookies criados, mas IE6 e FF belo trabalho ... ainda se você só quer receber cookies, esta é uma abordagem muito boa.

Você também deve validar as informações da sessão ativa contra domínios b, c, d, ... desta forma você só pode login se o usuário já logado no domínio a.

O que você faz é sobre o domínio receber as variáveis ??que você verificar o endereço de referência, bem assim você pode confirmar a ligação era de seu próprio domínio e não alguém simplesmente digitando o link na barra de endereços. Esta abordagem funciona bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top