9

参加サーバーの一部が Windows (IIS) ボックスになる単純なシングル サインオン シナリオを実装しようとしています。これには SPNEGO が適しているようです。

シナリオは次のとおりです。

  • ユーザーは、自分のユーザー名とパスワードを使用して SSO サービスにログインします。私は何らかのメカニズムを使用して彼を認証します。
  • しばらくして、ユーザーはアプリ A にアクセスしたいと考えています。
    • アプリ A に対するユーザーの要求は、SSO サービスによってインターセプトされます。SSO サービスは SPNEGO を使用して、ユーザーをアプリ A にログインさせます。
      • SSO サービスがアプリ A の Web ページにアクセスし、「WWW-Authenticate: Negotiate」応答を取得します。
      • SSO サービスは、ユーザーに代わって "Authorization: Negotiate xxx" 応答を生成し、アプリ A に応答します。ユーザーはアプリ A にログインしています。
    • SSO サービスは、アプリ A に対する後続のユーザー リクエストをインターセプトし、Authorization ヘッダーを挿入してからアプリ A に渡します。

そうですか?

必要なものは 2 つあります (少なくとも今考えられることは):

  • ユーザーに代わって "Authorization: Negotiate xxx" トークンを生成する機能 (可能であれば Python を使用)
  • Python で「Authorization: Negotiate xxx」ヘッダーを検証する機能 (プロジェクトの後半)
4

3 に答える 3

8

これはまさに Apple がCalendar Serverで行っていることです。SPNEGOを実装するために、プロセスの kerberos 部分用の python gssapi ライブラリがあります

サーバー認証部分については、CalendarServer/twistedcaldav/authkerb.py を参照してください。kerberos モジュール (ac モジュール) には有用なドキュメント文字列はありませんが、PyKerberos/pysrc/kerberos.py にはすべての関数定義があります。

svn トランクの URL は次のとおりです:
http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk
http://svn.calendarserver.org/repository/calendarserver/PyKerberos/trunk

于 2009-06-16T13:49:51.233 に答える
0

http://spnego.sourceforge.net/credential_delegation.htmlチュートリアルをご覧ください。あなたがやろうとしていることをやっているようです。

于 2009-11-04T16:19:56.740 に答える
-1

私はかなり長い間 (Linux で) 似たようなものを探していましたが、このページに何度もたどり着きましたが、答えはありませんでした。だからここに私の解決策があります、私は思いつきました:

Web サーバーは、mod_auth_kerb を備えた Apache です。かなり前から、Active Directory、シングル サインオン セットアップで既に実行されています。私が以前にすでにできたこと:

  • Linux でのシングル サインオンでの chromium の使用 (適切な krb5 セットアップを使用し、kinit user@domain を使用)
  • pywin32 パッケージの sspi を使用して、Python 接続とシングル サインオンを行います。sspi.ClientAuth("Negotiate", targetspn="http/%s" % host)

次のコード スニペットは、Linux で Kerberos を使用して Python シングル サインオン (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)
于 2015-12-03T19:10:44.937 に答える