私の会社は現在、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>
そしてそれはsomeBase64Data
はbase64
これのエンコードされたバージョン...
<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 trust、Tokens、およびアーティファクト。
皆さん、助けてくれてありがとう。過去数日間で多くの情報を見つけましたが、もう少し遊んだ後にそれらをつなぎ合わせることができる可能性があります。しかし、私はまだ簡単な「Here's the Post」ワークフローの記事を見つけていません。たぶんそれは私がこれがどのように機能するかについて間違っているからです。たぶん、これはそれほど人気がないからでしょう。しかし、ユーザー認証と同じくらい重要な何かの重要なステップを見逃さないように、ワークフローを確実に取得したかったのです。
特定の質問に答えて:
1。)「ID」値は何ですか?
SAMLシステムエンティティが識別子が一意であることを保証するメカニズムは、実装に任されています。ランダムまたは擬似ランダム技術が採用される場合、2つのランダムに選択された識別子が同一である確率は2 ^ -128以下でなければならず、長さは2 ^ -160以下でなければなりません(SHOULD)。この要件は、長さが128〜160ビットの間でランダムに選択された値をエンコードすることで満たすことができます。
2。)IdPはどのようにあなたを知っていますか?
。)応答はどこにあり、何を確認しますか?
4。)ログアウトはどうですか?
要するに、これは一から実装するのが非常に複雑になる可能性があります。 Ianが提案するように、実証済みのライブラリや製品を使用するのが最善です。彼のような企業は、仕様に従って実装し、他のベンダーとの相互運用性をテストするために数百時間の開発者時間を費やしてきました。
単一のJavaアプリケーションをサービスプロバイダーとして設定しようとしている場合は、 Oracle (スタンドアロンとして)または- ForgeRock (OpenAMにバンドル)。ForgeRock Fedletには、アイデンティティプロバイダーとしてShibboleth 2.2.1とのやり取りにいくつかの問題がありますが、構成がやや簡単で、より有益であることがわかりました。
それぞれに、デプロイに役立つREADMEに含まれる明示的な指示があります。Fedletが設定され、IDPと通信すると、成功ページに、フェデレーションSSOをアプリケーションに統合するために必要なすべてのコードが表示されます。AuthnRequestsおよびResponsesを送受信するバックグラウンド作業を行います。
スコットの答えは、あなたが持っていた質問に非常によく反応しますが、SAMLを生成するコードを自分で記述しようとすると、車輪が再発明されると思います。 Fedletは、まさにこのユースケースを念頭に置いて設計されました。