SSO com CAS ou OAuth?

184

Gostaria de saber se devo usar o protocolo CAS ou OAuth + algum provedor de autenticação para logon único.

Cenário de exemplo:

  1. Um usuário tenta acessar um recurso protegido, mas não é autenticado.
  2. O aplicativo redireciona o usuário para o servidor SSO.
  3. Se estiver autenticado, o usuário receberá um token do servidor SSO.
  4. O SSO redireciona para o aplicativo original.
  5. O aplicativo original verifica o token no servidor SSO.
  6. Se o token estiver ok, o acesso será permitido e o aplicativo saberá o ID do usuário.
  7. O usuário faz um logoff e é desconectado de todos os aplicativos conectados ao mesmo tempo (logon único).

Pelo que entendi, foi exatamente para isso que o CAS foi inventado. Os clientes CAS precisam implementar o protocolo CAS para usar o serviço de autenticação. Agora, estou pensando em usar o CAS ou OAuth no site do cliente (consumidor). O Outh é um substituto para essa parte do CAS? O OAuth como um novo padrão de fato deve ser preferido? Existe uma substituição fácil de usar (não o Sun OpenSSO!) Para a parte de autenticação do CAS que suporta métodos diferentes como nome de usuário / senha, certificados OpenID, TLS ...?

Contexto:

  • Aplicativos diferentes devem confiar na autenticação do servidor SSO e devem usar algo parecido com uma sessão.
  • Os aplicativos podem ser aplicativos da web da GUI ou serviços (REST).
  • O servidor SSO deve fornecer um ID do usuário, necessário para obter mais informações sobre o usuário, como funções, email etc. em um armazenamento central de informações do usuário.
  • A saída única deve ser possível.
  • A maioria dos clientes é escrita em Java ou PHP.

Acabei de descobrir o WRAP , que pode se tornar o sucessor do OAuth. É um novo protocolo especificado pela Microsoft, Google e Yahoo.

Termo aditivo

Aprendi que o OAuth não foi projetado para autenticação, mesmo que pudesse ser usado para implementar o SSO, mas apenas junto com um serviço SSO como o OpenID.

O OpenID me parece ser o "novo CAS". O CAS possui alguns recursos que o OpenID perde (como o logoff único), mas não deve ser difícil adicionar as partes ausentes em um cenário específico. Eu acho que o OpenID tem ampla aceitação e é melhor integrar o OpenID em aplicativos ou servidores de aplicativos. Eu sei que o CAS também suporta OpenID, mas acho que o CAS é dispensável com o OpenID.

Deamon
fonte
6
A saída única é um anti-recurso. Todos os estudos de usuários que eu conheço que cobriram indicaram que é de leve a extremamente confuso a novatos e usuários avançados. Pessoalmente, tenho que usar um sistema que faça logon único diariamente, e acho incrivelmente irritante. Quase nunca é o comportamento que eu quero.
Bob Aman
16
Não concorde que o logoff único é um antifeature. Tudo depende dos aplicativos em questão. Para aplicativos da Web que de alguma forma se relacionam, como o Google Mail e o Google Agenda, faz sentido que, se você sair explicitamente de um, sair do outro. Nos casos em que não há "relacionamento" aparente, concordo com Bob.
Ashwoods #
6
Observe que essa pergunta foi originalmente feita antes da introdução do OAuth 2.0; portanto, as informações relacionadas ao OAuth podem não estar mais corretas.
Andrew Andrew

Respostas:

238

O OpenID não é um 'sucessor' ou 'substituto' do CAS; eles são diferentes, na intenção e na implementação.

O CAS centraliza autenticação. Use-o se desejar que todos os seus aplicativos (provavelmente internos) solicitem que os usuários efetuem login em um único servidor (todos os aplicativos estão configurados para apontar para um único servidor CAS).

OpenID descentraliza autenticação. Use-o se desejar que seu aplicativo aceite o login de usuários em qualquer serviço de autenticação que ele queira (o usuário fornece o endereço do servidor OpenID - na verdade, o 'nome de usuário' é a URL do servidor).

Nenhuma das opções acima trata de autorização (sem extensões e / ou personalização).

OAuth lida com autorização, mas não substitui a tradicional 'tabela USER_ROLES' (acesso do usuário). Ele lida com autorização para terceiros.

Por exemplo, você deseja que seu aplicativo se integre ao Twitter: um usuário pode permitir que você twite automaticamente quando atualizar seus dados ou publicar um novo conteúdo. Você deseja acessar algum serviço ou recurso de terceiros em nome de um usuário, sem obter a senha (o que é obviamente inseguro para o usuário). O aplicativo solicita acesso ao Twitter, o usuário o autoriza (através do Twitter) e, em seguida, o aplicativo pode ter acesso.

Portanto, o OAuth não se refere ao logon único (nem substitui o protocolo CAS). Não se trata de você controlar o que o usuário pode acessar. Trata-se de deixar o usuário controlar como seus recursos podem ser acessados ​​por terceiros. Dois casos de uso muito diferentes.

Para o contexto que você descreveu, o CAS é provavelmente a escolha certa.

[Atualizada]

Dito isto, você pode implementar o SSO com OAuth, se considerar a identidade do usuário como um recurso protegido. É isso que 'Inscreva-se no GitHub' e os gostos fazem, basicamente. Provavelmente não é a intenção original do protocolo, mas pode ser feito. Se você controla o servidor OAuth e restringe os aplicativos a apenas se autenticarem com ele, é SSO.

Porém, não há uma maneira padrão de forçar o logout (o CAS possui esse recurso).

tetsuo
fonte
11
Embora o OAuth seja principalmente sobre autorização, ele pode ser usado como se fosse um servidor de autenticação central. Assim como a conta do Google OAuth é usada por muitos sites (incluindo SO) para autenticação, sem realmente usar qualquer serviço do provedor OAuth.
Amir Ali Akbari
1
Além disso, como dito na resposta Bertl, o CAS agora fornece OAuth como cliente ou servidor.
Anthony O.
3
Essa resposta ainda é relevante agora que o OAuth 2.0 existe? Como sua opinião mudou com o OAuth 2.0?
Andrew
6
O OAuth 2.0 ainda é um protocolo de autorização e não um protocolo de autenticação, mas é possível construir sobre o OAuth 2.0 para criar um protocolo de autenticação, que é o que o Facebook / LinkedIn etc. fizeram; a única extensão padronizada do OAuth 2.0 que fornece autenticação é o OpenID Connect, que é o sucessor designado do OpenID
Hans Z.
48

Costumo pensar dessa maneira:

Use o CAS se você controlar / possuir o sistema de autenticação do usuário e precisar suportar um conjunto heterogêneo de servidores e aplicativos que precisam de autenticação centralizada.

Use o OAuth se você quiser dar suporte à autenticação de usuários de sistemas que você não possui / suporta (por exemplo, Google, Facebook etc.).

Lance Weber
fonte
6
OpenID é um protocolo de autenticação, OAuth é um protocolo de autorização.
Zenw0lf
13

OpenID é um protocolo de autenticação, OAuth e OAuth WRAP são protocolos de autorização. Eles podem ser combinados com a extensão híbrida OpenID .

Eu preferiria fortemente ver as pessoas construindo sobre os padrões que têm muito impulso (mais suporte disponível, mais fácil envolver terceiros), mesmo que não sejam exatamente adequados para o aplicativo em questão. Nesse caso, o OAuth tem o momento, não o CAS. Você deve poder fazer tudo ou pelo menos quase tudo o que precisa fazer com o OAuth. Em algum momento posterior no futuro, o OAuth WRAP deve simplificar ainda mais as coisas (faz algumas compensações valiosas usando um token de portador e empurrando a criptografia para a camada de protocolo), mas ainda está em sua infância e, enquanto isso, o OAuth provavelmente fará o trabalho muito bem.

Por fim, se você optar por usar o OpenID e o OAuth, haverá mais bibliotecas para mais idiomas disponíveis para você e para qualquer pessoa que precise se integrar ao sistema. Você também tem muito mais olhos observando os protocolos, certificando-se de que eles são realmente tão seguros quanto deveriam.

Bob Aman
fonte
8

Para mim, a verdadeira diferença entre SSO e OAuth é conceder, não autenticação, porque um servidor que implementa o OAuth obviamente possui autenticação (você precisa fazer login no seu google, openId ou facebook para que o OAuth ocorra com o aplicativo cliente)

No SSO, um usuário avançado / sysadmin concede ao usuário final acesso antecipado a um aplicativo no "aplicativo SSO". No OAuth, o usuário final concede acesso ao aplicativo aos seus "dados" no "aplicativo OAuth"

Não vejo por que o protocolo OAuth não pôde ser usado como parte de um servidor SSO. Apenas retire a tela de concessão do fluxo e deixe o servidor OAuth procurar a concessão no banco de dados de backup.

redben
fonte
7

Postagem antiga, mas isso pode ser útil:

O CAS 3.5 oferecerá suporte ao oAuth como Cliente e Servidor. Veja: https://wiki.jasig.org/display/CASUM/OAuth

Bertl
fonte
3
Para as pessoas que visualizam isso e talvez confusas, o CASmencionado aqui é o servidor CAS, em vez do protocolo CAS .
precisa