web-dev-qa-db-ja.com

SAMLサービスプロバイダーになる方法

私の会社は現在、Java Webアプリケーションを開発しています。2、3のクライアントが内部SAMLサーバー(IDプロバイダー?)を持っているので、それらと統合するように要求しました。約3日後、OpenAMについて一般的な理解は得られましたが、まだ知識にギャップがあります。

そこで、ここにユーザーログインのワークフローを想像する方法を示します。

お客様のSAMLサーバーを https://their.samlserver.com として定義しましょう。したがって、ユーザーは保護されているリソースを求めてWebアプリケーションにアクセスします。 URLが http://my.app.com/something であるとしましょう。

私が正しい場合、my.app.comはSAMLがService Provider。このアプリケーションは、このユーザーがログインする必要があることを認識しています。次に、このようなページをユーザーに提示します...

<script>JQuery Script to auto submit this form on ready</script>
<form method="post" action="https://their.samlserver.com/Post/Servlet">
    <input type="hidden" name="SAMLRequest" value="someBase64Data" />
    <input type="submit" value="Submit" />
</form>

そしてそれはsomeBase64Database64これのエンコードされたバージョン...

<samlp:AuthnRequest
  xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
  xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
  ID="identifier_1"
  Version="2.0"
  IssueInstant="2004-12-05T09:21:59Z"
  AssertionConsumerServiceIndex="0">
 <saml:Issuer>http://my.app.com</saml:Issuer>
 <samlp:NameIDPolicy
   AllowCreate="true"
   Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
</samlp:AuthnRequest>

だから私の最初のカップルの質問。

[〜#〜] id [〜#〜]値とは何ですか?

そして、なぜIssuerとして宣言できるのでしょうか?

アイデンティティプロバイダーは私を知っていますか?たぶんこれは、Circle of trust私が見ていましたOpenAM 。そして、それが私について知っているなら、それは私についてどのように知っていますか、そして何を知る必要がありますか?

そのため、ユーザーがそのページを転送すると、IDP https://their.samlserver.com によって提供されるページに移動します。彼らはそのページで認証を行い、IDPは認証を検証してユーザーを検索するのが魔法です。認証が成功すると、IDPは<samlp:Response>定義 ここ

さらにいくつかの質問

まず、<samlp:Response> Webアプリケーションに戻って確認できますか?

そして、それが成功したことを検証するために、その応答で何を探すべきですか?失敗はどのように見えますか?

現在、ユーザーを識別するために電子メールアドレス(LDAP)を使用しているので、おそらく応答からそれを取得し、今と同じ方法で使用します。その応答で私が他に気をつけるべきことはありますか?

その応答の有効性を確認したので、現在のようにユーザーにセッションを許可できます。しかし、ログアウトしたい場合、そのためのワークフローはありますか?ユーザーが去ったことをIDPに通知する必要がありますか?

そして最後に、私の読書にはいくつかのトピックが投げ込まれていますが、このワークフローにどのように適合するかはわかりません。それらはCircle of trustTokens、およびアーティファクト

皆さん、助けてくれてありがとう。過去数日間で多くの情報を見つけましたが、もう少し遊んだ後にそれらをつなぎ合わせることができる可能性があります。しかし、私はまだ簡単な「Here's the Post」ワークフローの記事を見つけていません。たぶんそれは私がこれがどのように機能するかについて間違っているからです。たぶん、これはそれほど人気が​​ないからでしょう。しかし、ユーザー認証と同じくらい重要な何かの重要なステップを見逃さないように、ワークフローを確実に取得したかったのです。

78
Staros

特定の質問に答えて:

1。)「ID」値は何ですか?

  • これは、SAML要求の一意の識別子である必要があります。 SAML 2.0仕様では、これが実際にどのように行われるかは実装固有であると述べていますが、次の推奨事項を作成しています。

SAMLシステムエンティティが識別子が一意であることを保証するメカニズムは、実装に任されています。ランダムまたは擬似ランダム技術が採用される場合、2つのランダムに選択された識別子が同一である確率は2 ^ -128以下でなければならず、長さは2 ^ -160以下でなければなりません(SHOULD)。この要件は、長さが128〜160ビットの間でランダムに選択された値をエンコードすることで満たすことができます。

2。)IdPはどのようにあなたを知っていますか?

  • SPはIdPに登録する必要があります。これを達成するために、SAML仕様は、SAMLレシーバーがどこにあるか、証明書が何であるかをIdPに伝える「SAMLメタデータ」の形式を定義しますOpenAMは、信頼できるSPを構成するためのいくつかの最小要件を決定する可能性があります。これは各製品で異なります。

。)応答はどこにあり、何を確認しますか?

  • 応答は、通常SPから初期セットアップのためにIdPと交換するSAMLメタデータで定義されているアサーションコンシューマサービス(ACS)URLに送信されます。SAML応答を受信したら、多くのことを確認しますが、最も重要なことは、SAMLステータスコードが「成功」であり、inResponseTo IDがリクエストの送信されたものと一致し、アサーションのデジタル署名を検証する必要があることです。そのためには、IdPのパブリックを信頼する必要があります検証証明書、そしておそらく失効チェックもしたいと思うでしょう。

4。)ログアウトはどうですか?

  • SAML 2.0は、Single LogOut(SLO)のプロファイルも定義します。これにより、SPからログアウトするだけでなく、IdPと、セッションを確立した他のSPも潜在的にログアウトします。シングルサインオン(SSO)と同様の要求/応答フローがあるため、セットアップおよびチェックするもの(ステータスコード、署名など)も似ています。

要するに、これは一から実装するのが非常に複雑になる可能性があります。 Ianが提案するように、実証済みのライブラリや製品を使用するのが最善です。彼のような企業は、仕様に従って実装し、他のベンダーとの相互運用性をテストするために数百時間の開発者時間を費やしてきました。

45
Scott T.

単一のJavaアプリケーションをサービスプロバイダーとして設定しようとしている場合は、 Oracle (スタンドアロンとして)または- ForgeRock (OpenAMにバンドル)。ForgeRock Fedletには、アイデンティティプロバイダーとしてShibboleth 2.2.1とのやり取りにいくつかの問題がありますが、構成がやや簡単で、より有益であることがわかりました。

それぞれに、デプロイに役立つREADMEに含まれる明示的な指示があります。Fedletが設定され、IDPと通信すると、成功ページに、フェデレーションSSOをアプリケーションに統合するために必要なすべてのコードが表示されます。AuthnRequestsおよびResponsesを送受信するバックグラウンド作業を行います。

スコットの答えは、あなたが持っていた質問に非常によく反応しますが、SAMLを生成するコードを自分で記述しようとすると、車輪が再発明されると思います。 Fedletは、まさにこのユースケースを念頭に置いて設計されました。

2
user538917