Pergunta

Eu estou tentando implementar um simples Single Sign On cenário onde alguns dos servidores participantes será janelas (IIS) caixas. Parece que SPNEGO é um caminho razoável para isso.

Aqui está o cenário:

    toras
  • usuário no meu serviço de SSO usando seu nome de usuário e senha. I autenticar-lo usando algum mecanismo.
  • Em algum tempo depois, o usuário deseja acessar App A.
    • O pedido do usuário para App A é interceptado pelo serviço SSO. Os usos de serviços SSO SPNEGO para registrar o usuário para a App A:
      • O serviço SSO atinge a página web App A, recebe um "WWW-Authenticate: Negociar" resposta
      • O serviço SSO gera uma "Autorização: negociar xxx". Resposta em nome do usuário, responde a App A. O utilizador esta conectado para App A
    • Os intercepta serviço SSO subsequentes pedidos de usuários para App A, inserir o cabeçalho de autorização para eles antes de passá-los para App A.

O que parece certo?

Eu preciso duas coisas (pelo menos que eu posso pensar de agora):

  • a capacidade de gerar a "Autorização: negociar xxx" token nome do utilizador, de preferência usando Python
  • a capacidade de validar "Autorização: negociar xxx" cabeçalhos em Python (para uma parte posterior do projecto)
Foi útil?

Solução

Este é exatamente o que a Apple faz com o seu Calendar Server . Eles têm um python gssapi biblioteca para a parte kerberos do processo, a fim de implementar SPNEGO .

Procurar em CalendarServer / twistedcaldav / authkerb.py para a parte de autenticação do servidor. faz o Kerberos módulo (que é um módulo c), não tem nenhum docstrings úteis, mas PyKerberos / pysrc / kerberos.py tem todas as definições de funções.

Eis as urls para os troncos svn:
http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk
http://svn.calendarserver.org/repository/calendarserver/PyKerberos/trunk

Outras dicas

Dê uma olhada na http://spnego.sourceforge.net/credential_delegation.html tutorial. Ele parece estar fazendo o que você está tentando fazer.

Eu tenho procurado há algum tempo por algo semelhante (no Linux), que me levou a esta página várias vezes, mas sem dar resposta. Então aqui está a minha solução, eu vim com:

O servidor web é um Apache com mod_auth_kerb. Ele já está em execução em um Active Directory, sign-on único configuração desde há algum tempo. O que já foi capaz de fazer antes:

  • Usando cromo com single sign on no Linux (com uma configuração krb5 adequada, com o trabalho de usuário kinit @ domínio)
  • Tendo python sinal de conexão e única sobre o uso sspi do pacote pywin32, com algo como sspi.ClientAuth("Negotiate", targetspn="http/%s" % host)

O seguinte trecho de código completa o quebra-cabeça (e as minhas necessidades), tendo Python single sign on com Kerberos no Linux (usando python-gssapi):

in_token=base64.b64decode(neg_value)
service_name = gssapi.Name("HTTP@%s" % host, gssapi.C_NT_HOSTBASED_SERVICE)
spnegoMechOid = gssapi.oids.OID.mech_from_string("1.3.6.1.5.5.2")
ctx = gssapi.InitContext(service_name,mech_type=spnegoMechOid)
out_token = ctx.step(in_token)
buffer = sspi.AuthenticationBuffer()
outStr = base64.b64encode(out_token)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top