SAML Profiles ～ SSOだけじゃなく色んなシナリオあるって知ってた？ ～

#SAML Profiles ～ SSOだけじゃなく色んなシナリオあるって知ってた？ ～

[以前の記事](https://qiita.com/SAM-l/items/a144a8661635fcc9fb0e)で振り返っていたSAMLの仕様を掘り下げてみよう:exclamation:のパート:one:です。

まずはCore･･･にいきたいところですが、プロファイル仕様についてです。
どのようなシナリオで利用されるかが書いてある仕様なので、全貌を俯瞰しやすいかと思いこれから攻めることにしました。

>Profiles for the OASIS Security Assertion Markup Language (SAML) V2.0
>http://docs.oasis-open.org/security/saml/v2.0/saml-profiles-2.0-os.pdf

## 存在するプロファイル
目次から抜粋。思ったよりたくさんありました:sweat_smile:

SAMLは、認証連携だけでなくID連携が強く意識されている仕様なので、**NameID（名前識別子）**の管理やマッピングのプロファイルが存在します。

> - SAML SSO
>    - WebブラウザSSO
>    - ECP（Enhanced Client or Proxy）
>    - IdPディスカバリ
>    - SLO（Single Logout）
>    - NameID管理　
> - Artifact Resolution
> - Assertion要求
> - NameIDマッピング
> - SAML Attribute


以下、各プロファイルについて見ていきます。
図は全て[仕様書](http://docs.oasis-open.org/security/saml/v2.0/saml-profiles-2.0-os.pdf)からの抜粋。

###WebブラウザSSO
最も使われているProfileがこれでしょう。というか、SAML使ってます！と謳っているものが指すのははほとんどこれ。詳細は[以前の記事](https://qiita.com/SAM-l/items/a144a8661635fcc9fb0e)で触れているのでそちらを参照ください。
![WebBrowserSSO.png](https://qiita-image-store.s3.amazonaws.com/0/246440/c2b646f4-e\4c6-73a3-0920-e15f0bc081d6.png)


###ECP（Enhanced Client or Proxy）
ECPはSAMLを話せるプロキシ、のようなものです。ブラウザではないUserAgentがWebブラウザSSOのようにSAMLを利用する際に活用されます。
![ECP.png](https://qiita-image-store.s3.amazonaws.com/0/246440/6b184bf4-4b39-4f0c-2738-51962426786d.png)
> 1. ECP が SP に HTTP Request を発行する
> 2. SP が ECP に \<AuthnRequest> を発行する
> 3. ECP が IdP を決定する
> 4. ECP が \<AuthnRequest> を IdP に伝達する
> 5. IdP が ユーザを識別する
> 6. IdP が ECP に SPをターゲットとした \<Response> を発行する
> 7. ECP が \<Response> を SP に伝達する
> 8. SP がユーザのアクセスを許可/拒否する

ECPについては、[Shibbolethのwiki](https://wiki.shibboleth.net/confluence/display/CONCEPT/ECP) に分かりやすい解説がありました。

###IdPディスカバリ
同じトラストサークル中に複数のIdPが存在する場合、ユーザがどのIdPを常用しているのかを確認するプロファイルとなります。共通ドメインクッキーで解決する方法が定義されており、シーケンスもありません。

###SLO（Single Logout）
ログインだけでなく、ログアウトも共有しよう:exclamation:というプロファイルです。
![SLO.png](https://qiita-image-store.s3.amazonaws.com/0/246440/44949b31-d59e-6d12-67a1-cb08e438b0a6.png)
> 1. ユーザがログアウトを試みたSP から IdP に \<LogoutRequest> が発行される
> 2. IdP は 終了するセッション を特定する
> 3. IdP は \<LogoutRequest> を 他のSPに発行する
> 4. IdP から \<LogoutRequest> を 受け取った他の SP が IdP に \<LogoutResponse> を返却する 
> 5. IdP は \<LogoutRequest> を受け取った SP に \<LogoutResponse> を返却する

ややこしい･･･:sweat:
そして途中で通信切れたらSLO終わらない:sweat_smile:

OIDCでは＋α のことが [Session Management](http://openid.net/specs/openid-connect-session-1_0.html) で実現できます。

###NameID管理
NameIDの変更が発生した際に、それを他のProviderに伝達するプロファイルです。
![NameIdentifierManamement.png](https://qiita-image-store.s3.amazonaws.com/0/246440/8be383bb-ebdd-7ab7-cf64-2cb044f6c4b3.png)
> 1. 変更を知らせたい Providerが \<ManageNameIDRequest> を相手側 Provider に発行する
> 2. 要求が処理された後、\<ManageNameIDResponse> が返却される


###Artifact Resolution
Artifactを解決するためのプロファイルです。

Artifactって･･･いきなり何のことですか？！って感じだと思いますが、[SAML Bindings](http://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf)で定義されている通信方法のうちのひとつに登場する、チケットのようなものです。User Agent 経由の Front Channel で大きなサイズの電文のやり取りをしなくて良いように、電文の代わりに Artifact というチケットを渡しておいて、あとで Back Channel でチケットと電文を引き換える、みたいなイメージで使われるものです。

その**「チケットと電文を引き換える」**部分のプロファイルになります。
![Artifact.png](https://qiita-image-store.s3.amazonaws.com/0/246440/f5eb411a-5e70-35eb-c33c-b8970128a5d4.png)

> 1. 要求元が \<ArtifactResolve> を発行する
> 2. 要求が処理されたあと、 \<ArtifactResponse> が返却される

###Assertion要求
ユーザインタラクションが必要ない Back Channel で Assertion を要求するプロファイルです。

WebブラウザSSOで送付するRequest電文は \<AuthnRequest>でしたが、\<AssertionIDRequest> や \<SubjectQuery>、\<AuthnQuery>、\<AttributeQuery>、\<AuthzDecisionQuery> などでAssertionを要求する場合、このプロファイルになります。

![Query.png](https://qiita-image-store.s3.amazonaws.com/0/246440/e63d44e4-4caf-acbc-327e-0b6c97350d21.png)

> 1. Query あるいは Request が発行される
> 2. \<Response> が発行される

###NameIDマッピング
識別子ってひとつしかないんじゃないのマッピングって何それ:question:
となるかもしれませんが、SAMLでは使うNameIDのPolicyをあれこれ指定できるので、「別の形式のNameIDに変換して！」とか「別のSPが解釈できるNameIDに変換して！」といったことが発生します。そういう時に使うプロファイルです。

![NIMapping.png](https://qiita-image-store.s3.amazonaws.com/0/246440/101b3934-0a72-11fb-d61d-d1515707c1b4.png)

> 1. 必要なエンティティから IdP へ \<NameIDMappingRequest> が発行される
> 2. IdP は要求を処理し、 \<NameIDMappingResponse> を発行する

###SAML Attribute
これはProfileなのかなぁ。
属性情報のやりとりのプロファイルは、上記 **Assertion要求** の通りです。

ここでは、属性情報をやり取りするときに、こういう属性情報はこういうパラメータ名で送りましょうとかそんなのが定義されているように見えます。

##おわりに
**SAML**と言っても、大半の方は「WebブラウザSSO」しか触れたことがないのではないでしょうか。実はこんなにたくさんのプロファイルが存在して、いろんなことが検討されていたのです。私も把握できていないものがちらほらあります:pensive::pensive:

しかし、改めて仕様書だけ見ても、案の定さっぱり:sweat_smile::sweat_smile:

Profileの仕様を読めば、その通信は、どんなシナリオでどういった目的で、やり取りされるものなのかが理解できるだろうと思ったのですが、そうでもなくて･･･。

「こういうプロファイルがあります」「こういう電文のやりとりがされます」については細かく記されているものの、どういった目的で使われるプロファイルなのかっていうのがやっぱり見えてこなかったです:pensive::pensive:

そういったところこそ知りたいのに、なかなか、勉強するって難しいですね:woman_tone1::woman_tone1: