SAML 2.0

**Security Assertion Markup Language 2.0** (**SAML&nbsp;2.0**)はsecurity domain間の認証と認可アイデンティティをやりとりするための SAML規格のバージョンである。SAML&nbsp;2.0 は アサーション を含む セキュリティトークン を利用して、SAMLオーソリティ（アイデンティティプロバイダ）とSAMLコンシューマ（サービスプロバイダ）との間で本人（通常はエンドユーザ）に関する情報をやり取りするXML-ベースのプロトコルである。SAML&nbsp;2.0はウェブベースのクロスドメインシングルサインオン (SSO) を可能にし、複数の認証トークンをユーザに配布する際の管理負荷を減らす。

SAML 2.0は、SAML 1.1に代わり、2005年3月にOASIS標準として承認された。SAML 2.0の重要な側面は、公式ドキュメントであるSAMLCore、 SAMLBind、 SAMLProf、、SAMLMetaに詳細に記載されている。

SAML 2.0の策定には、24以上の企業・団体から約30名が参加した。特筆すべきは*[[:en:Liberty Alliance|Liberty Alliance]]*がそのIDフェデレーション・フレームワーク（ID-FF）仕様をOASISに寄贈したことであり、これがSAML&nbsp;2.0の仕様のベースとなった。したがって、SAML&nbsp;2.0は、SAML 1.1、Liberty ID-FF&nbsp;1.2、Shibboleth&nbsp;1.3 が収れんしたものと言える。

## SAML 2.0 アサーション

アサーションとは、SAMLオーソリティーが作成した 0 個以上のステートメントを提供する情報のパッケージである。SAML のアサーションは通常、`<Subject>` 要素で表されるサブジェクトについて行われる。SAML 2.0 仕様では、SAMLオーソリティーが作成できる 3 種類のアサーション・ステートメントを定義している。SAML で定義されたステートメントはすべて、サブジェクトに関連付けられている。 定義されている3種類のステートメントは以下のとおりである：
* 認証アサーション（Authentication Assertion）：アサーション・サブジェクトは、特定の時間に特定の方法で認証された。
* 属性アサーション（Attribute Assertion）： アサーション・サブジェクトは、提供された属性に関連付けられている。
* 認可決定アサーション（Authorization Decision Assertion）:アサーション対象者が指定されたリソースにアクセスする許可を求める要求が、許可または拒否された。

SAML アサーションの重要なタイプは、Web ブラウザの SSO を促進するために使用される、いわゆる "bearer"  アサーションである。

以下は、アイデンティティプロバイダ () からサービスプロバイダ ()に対 して発行された短命のベアラ・アサーションの例である。このアサーションには、認証アサーション `<saml:AuthnStatement>` および属性アサーション`<saml:AttributeStatement>`の両方が含まれており、サービスプロバイダはこれらを使用してアクセス・コントロールの決定を行うはずである。接頭辞 `saml:`は、SAML V2.0アサーションの名前空間を表す。

### SAMLの例

```xml
<saml:Assertion
   xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   ID="_d71a3a8e9fcc45c9e9d248ef7049393fc8f04e5f75"
   Version="2.0"
   IssueInstant="2004-12-05T09:22:05Z">
   <saml:Issuer>https://idp.example.org/SAML2</saml:Issuer>
   <ds:Signature
     xmlns:ds="http://www.w3.org/2000/09/xmldsig#">...</ds:Signature>
   <saml:Subject>
     <saml:NameID
       Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">
       3f7b3dcf-1674-4ecd-92c8-1544f346baf8
     </saml:NameID>
     <saml:SubjectConfirmation
       Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
       <saml:SubjectConfirmationData
         InResponseTo="aaf23196-1773-2113-474a-fe114412ab72"
         Recipient="https://sp.example.com/SAML2/SSO/POST"
         NotOnOrAfter="2004-12-05T09:27:05Z"/>
     </saml:SubjectConfirmation>
   </saml:Subject>
   <saml:Conditions
     NotBefore="2004-12-05T09:17:05Z"
     NotOnOrAfter="2004-12-05T09:27:05Z">
     <saml:AudienceRestriction>
       <saml:Audience>https://sp.example.com/SAML2</saml:Audience>
     </saml:AudienceRestriction>
   </saml:Conditions>
   <saml:AuthnStatement
     AuthnInstant="2004-12-05T09:22:00Z"
     SessionIndex="b07b804c-7c29-ea16-7300-4f3d6f7928ac">
     <saml:AuthnContext>
       <saml:AuthnContextClassRef>
         urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
       </saml:AuthnContextClassRef>
     </saml:AuthnContext>
   </saml:AuthnStatement>
   <saml:AttributeStatement>
     <saml:Attribute
       xmlns:x500="urn:oasis:names:tc:SAML:2.0:profiles:attribute:X500"
       x500:Encoding="LDAP"
       NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
       Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.1"
       FriendlyName="eduPersonAffiliation">
       <saml:AttributeValue
         xsi:type="xs:string">member</saml:AttributeValue>
       <saml:AttributeValue
         xsi:type="xs:string">staff</saml:AttributeValue>
     </saml:Attribute>
   </saml:AttributeStatement>
 </saml:Assertion>
```


なお、上記の例では、`<saml:Assertion>`要素に以下の子要素が含まれている：

* `<saml:Issuer>`要素：アイデンティティプロバイダの一意の識別子を含む。
* `<ds:Signature>`要素：`<saml:Assertion>`要素に対する整合性保持のデジタル署名（表示せず）を含む
* `<saml:Subject>`要素：認証されたプリンシパルを識別する。ただし、この場合、プライバシー保護の観点から、プリンシパルの身元は不透明な一時的な識別子で隠されてる。
* `<saml:Conditions>` 要素：アサーションが「有効」とみなされる条件を示す。
* `<saml:AuthnStatement>` 要素：IDプロバイダでの認証行為を記述する。
* `<saml:AttributeStatement>` 要素：これは認証されたプリンシパルに関連する多値の属性を主張する。

言い換えれば、アサーションは以下の情報をエンコードしたものである：

サービスプロバイダ ()専用のサブジェクト(3f7b3dcf-1674-4ecd-92c8-1544f346baf8)について、アサーション("b07b804c-7c29-ea16-7300-4f3d6f7928ac")が"2004-12-05T09:22:05Z"の時点でアイデンティティプロバイダ () によって発行された。 

特に、認証ステートメントは以下のように主張している：

`<saml:Subject>` 要素で特定されたプリンシパルは、保護されたチャネル上で送信されたパスワードによって、"2004-12-05T09:22:00Z"の時点で認証された。

同様に、属性ステートメントは次のように主張する。

`<saml:Subject>`要素で特定されるプリンシパルは、この機関のスタッフである。

## SAML 2.0 プロトコル

SAMLCoreでは以下のプロトコルが規定されている。

* アサーションクエリおよびリクエストプロトコル
* 認証要求プロトコル
* Artifact Resolution Protocol
* 名前識別子管理プロトコル
* シングルログアウトプロトコル
* 名前識別子マッピングプロトコル

これらのプロトコルのうち、最も重要な「認証要求プロトコル」について、以下に詳しく説明する。

### 認証要求プロトコル

SAML 1.1 WebブラウザSSOプロファイルはIdentity Provider (IDP)によって開始（initiate）される。つまり、 一方的な`<samlp:Response>`要素がアイデンティティプロバイダから(ブラウザ経由で)サービスプロバイダに送信される。（接頭辞 `samlp:`はSAMLプロトコルの名前空間を示す。）

ただし、SAML&nbsp;2.0 では、流れはサービスプロバイダから始まり、サービスプロバイダは アイデンティティプロバイダに明示的な認証要求を発行する。結果として生じる「認証要求プロトコル」は、SAML&nbsp;2.0 の重要な新機能である。

プリンシパル（またはプリンシパルの代理を務めるエンティティ）が認証ステートメントを含むアサーションの取得を希望する場合、`<samlp:AuthnRequest>`要素がアイデンティティプロバイダに送信される：

```xml
<samlp:AuthnRequest
    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
    ID="aaf23196-1773-2113-474a-fe114412ab72"
    Version="2.0"
    IssueInstant="2004-12-05T09:21:59Z"
    AssertionConsumerServiceIndex="0"
    AttributeConsumingServiceIndex="0">
    <saml:Issuer>https://sp.example.com/SAML2</saml:Issuer>
    <samlp:NameIDPolicy
      AllowCreate="true"
      Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
  </samlp:AuthnRequest>
```

上記の`<samlp:AuthnRequest>`要素は、暗黙的に 認証ステートメントを含むアサーションを要求するものであり、サービスプロバイダ () によって明確に発行され、その後（ブラウザを介して）アイデンティティプロバイダに提示された。 アイデンティティプロバイダは（必要であれば）プリンシパルを認証し、認証応答を発行する。認証応答は、（再びブラウザを介して）サービスプロバイダに送信される。

### アーティファクト解決プロトコル

SAML メッセージは、あるエンティティから別のエンティティへ、「値」または「参照」によって送信される。SAML メッセージへの参照は「アーティファクト」と呼ばれる。
アーティファクトの受信者は、`<samlp:ArtifactResolve>` 要求をアーティファクトの発行者に直接送信することによって参照を解決し、発行者はアーティファクトによって参照される実際のメッセージで応答する。
たとえば、アイデンティティプロバイダが次の`<samlp:ArtifactResolve>` リクエストを（バック・チャネルを介して）サービスプロバイダに直接送信したとすると、次のようになる：

```xml
<samlp:ArtifactResolve
    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
    ID="_cce4ee769ed970b501d680f697989d14"
    Version="2.0"
    IssueInstant="2004-12-05T09:21:58Z">
    <saml:Issuer>https://idp.example.org/SAML2</saml:Issuer>
    
    <ds:Signature
      xmlns:ds="http://www.w3.org/2000/09/xmldsig#">...</ds:Signature>
    <samlp:Artifact>AAQAAMh48/1oXIM+sDo7Dh2qMp1HM4IF5DaRNmDj6RdUmllwn9jJHyEgIi8=</samlp:Artifact>
  </samlp:ArtifactResolve>
```


応答として、サービスプロバイダは、封入されたアーティファクトによって参照されるSAML要素を返す。 このプロトコルは、HTTP Artifact Bindingの基礎を形成している。

## SAML 2.0バインディング

SAML&nbsp;2.0 がサポートする「バインディング」の概要は、Bindings 仕様（(SAMLBind)に記載されている：

* SAML SOAP Binding (based on SOAP&nbsp;1.1)
* Reverse SOAP (PAOS) Binding
* HTTP Redirect Binding
* HTTP POST Binding
* HTTP Artifact Binding
* SAML URI バインディング

Web ブラウザ SSO では、HTTP リダイレクト・バインディングと HTTP POST バインディングがよく使われる。 たとえば、サービスプロバイダは HTTP リダイレクトを使用して要求を送信する一方で、アイデンティティプロバイダは HTTP POST を使用して応答を送信することができる。 この例は、エンティティのバインディングの選択が、パートナーのバインディングの選択とは無関係で あることを示している。

### HTTPリダイレクト・バインディング

SAML プロトコルメッセージは、HTTP GETリクエストのURLクエリ文字列で直接伝えることができる。URLの長さは実際には限られているので、HTTPリダイレクト・バインディングは、`<samlp:AuthnRequest>` メッセージなどの短いメッセージに適している。長いメッセージ(例えば、SAMLレスポンスのように、署名済みまたは暗号化されたSAMLアサーションを含むメッセージ)は、通常、 HTTP POSTバインディングのような他のバインディングを介して送信される。

HTTPリダイレクトで送信される SAMLリクエストまたはレスポンスには、それぞれ`SAMLRequest` または`SAMLResponse` クエリ文字列パラメータがある。メッセージは送信される前に、deflated （ヘッダーとチェックサムなし）、base64エンコード、URLエンコードが順に行われる。受信時には、元のメッセージを復元するために、このプロセスを逆に行う。

例えば、上記の `<samlp:AuthnRequest>`メッセージをエンコードすると、次のようになる：

  

上記のメッセージ（可読性のためにフォーマットされている）は、追加のセキュリティのために署名される場合もある。実際には、`<samlp:AuthnRequest>`に含まれるすべてのデータ（SP ID を含む`Issuer`や`NameIDPolicy`など）は、事前に IdP と SP の間で（手動での情報交換や SAMLメタデータを介して）合意されている。その場合、リクエストへの署名はセキュリティ上の制約とはならない。`<samlp:AuthnRequest>`に、アサーション・コンシューマー・サービスのURLなど、IdPが事前に把握していない情報が含まれている場合、セキュリティの観点からリクエストへの署名が推奨される。

### HTTP POSTバインディング

以下の例では、サービスプロバイダと アイデンティティプロバイダの両方が HTTP POST バインディングを使用している。最初に、サービスプロバイダはuser agent からの要求に、XHTML フォームを含むドキュメントで応答する。


```html
<form method="post" action="https://idp.example.org/SAML2/SSO/POST" ...>
    <input type="hidden" name="SAMLRequest" value="''request''" />
    ... その他のインプットパラメータ....
  </form>
```

`SAMLRequest`パラメータの値は、`<samlp:AuthnRequest>`要素のbase64エンコードであり、ブラウザ経由でアイデンティティプロバイダに送信される。アイデンティティプロバイダの SSO サービスは要求を検証し、別の XHTML フォームを含む文書で応答する：

```html
<form method="post" action="https://sp.example.com/SAML2/SSO/POST" ...>
    <input type="hidden" name="SAMLResponse" value="''response''" />
    ...
  </form>
```


`SAMLResponse`パラメータの値は、`<samlp:Response>`要素のbase64エンコーディングであり、同様にブラウザを介してサービスプロバイダに送信される。

フォームの送信を自動化するためには、次のようなJavaScriptの行をXHTMLページの任意の場所に加える：

```javascript
window.onload = function () { document.forms[0].submit(); }
```


これは、ページ内の最初のform要素に、上記のSAMLResponseを含む`form`要素（`forms[0]`）が含まれていることを前提としている。

### HTTP アーティファクト・バインディング

HTTP アーティファクトバインディングは、Artifact Resolution Protocolと SAML SOAP バインディング（HTTP上）を使用して、SAMLメッセージを参照により解決する。以下の具体例を考えてみる。サービスプロバイダが、アイデンティティプロバイダに`<samlp:AuthnRequest>` メッセージを送信したいとする。最初に、サービスプロバイダは、HTTPリダイレクトを介してアイデンティティプロバイダにアーティファクトを送信する。

  ?SAMLart=*artifact*

次に、アイデンティティプロバイダは、バック・チャネルを介してサービスプロバイダに直接リクエスト（先に示したArtifactResolveRequest など）を送信する。最後に、サービスプロバイダは、参照されたメッセージを含む`<samlp:AuthnRequest>` 要素を返す：


```xml
<samlp:ArtifactResponse
    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
    ID="_d84a49e5958803dedcff4c984c2b0d95"
    InResponseTo="_cce4ee769ed970b501d680f697989d14"
    Version="2.0"
    IssueInstant="2004-12-05T09:21:59Z">
    
    <ds:Signature
      xmlns:ds="http://www.w3.org/2000/09/xmldsig#">...</ds:Signature>
    <samlp:Status>
      <samlp:StatusCode
        Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
    </samlp:Status>
    <samlp:AuthnRequest
      xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
      xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
      ID="_306f8ec5b618f361c70b6ffb1480eade"
      Version="2.0"
      IssueInstant="2004-12-05T09:21:59Z"
      Destination="https://idp.example.org/SAML2/SSO/Artifact"
      ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact"
      AssertionConsumerServiceURL="https://sp.example.com/SAML2/SSO/Artifact">
      <saml:Issuer>https://sp.example.com/SAML2</saml:Issuer>
      <samlp:NameIDPolicy
        AllowCreate="false"
        Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"/>
    </samlp:AuthnRequest>
  </samlp:ArtifactResponse>
```


もちろん、フローは逆方向にも可能である。つまり、アイデンティティプロバイダはアーティファクトを発行することができ、実際にはこれがより一般的である。 たとえば、このトピックで後述する「double artifact」のプロファイル例を参照。

#### アーティファクトのフォーマット
一般に、SAML&nbsp;2.0の*アーティファクト*は以下のように定義される（SAMLBind）：

  SAML_artifact := B64 (TypeCode EndpointIndex RemainingArtifact)
  TypeCode      := Byte1Byte2
  EndpointIndex := Byte1Byte2

したがって、SAML&nbsp;2.0のアーティファクトは、2バイトの`TypeCode`、2バイトの`EndpointIndex`、および`RemainingArtifact`と呼ばれる任意のバイト列の3つのコンポーネントから構成される。 これらの3つの情報は連結され、base64エンコードされて完全なアーティファクトとなる。

`TypeCode`は、アーティファクトの形式を一意に識別する。 SAML&nbsp;2.0では、このようなアーティファクトを1つだけ定義しており、タイプは&nbsp;0x0004である。 `EndpointIndex`は、アーティファクトの発行者(前述のようにIdPまたはSPのいずれかである)が管理する特定のアーティファクト解決エンドポイントへの参照である。 `RemainingArtifact`は、タイプの定義によって決定され、アーティファクトの「肉」となるものである。

また、「type&nbsp;0x0004 artifact」のフォーマットは以下のように定義される：

  TypeCode            := 0x0004
  RemainingArtifact   := SourceId MessageHandle
  SourceId            := 20-byte_sequence
  MessageHandle       := 20-byte_sequence

したがって、タイプ&nbsp;0x0004のアーティファクトは、サイズが44&nbsp;バイト(エンコードされていない)である。 `SourceId`は任意のバイト列であるが、実際には、`SourceId`は発行者のentityIDのSHA-1ハッシュである。 `MessageHandle`はランダムなバイト列で、アーティファクト発行者がオンデマンドで作成することを望んでいるSAMLメッセージを参照する。

例えば、この16進法のタイプ&nbsp;0x0004のアーティファクトを考える：

  00040000c878f3fd685c833eb03a3b0e1daa329d47338205e436913660e3e917549a59709fd8c91f2120222f

よく見ると、アーティファクトの先頭に`TypeCode`(0x0004)と`EndpointIndex`(0x0000)が表示されている。 次の20&nbsp;バイトは、発行者のentityID()のSHA-1ハッシュで、その後に20のランダムバイトが続いている。 この44&nbsp;バイトをbase64エンコードしたものが、上記のArtifactResolveRequestの例で見られる。

## SAML 2.0プロファイル

SAML&nbsp;2.0 では、SAML&nbsp;1.1 と同様に、主要なユースケースは依然として Web ブラウザによる SSO であるが、SAML 2.0 のスコープは、以下のプロファイルの網羅的なリストに示されているように、以前のバージョンの SAML よりも広くなっている。

* SSO Profiles
** Web browser SSO profile
** Enhanced Client or Proxy (ECP) Profile
** Identity Provider Discovery Profile
** Single Logout Profile
** Name Identifier Management Profile
* Artifact Resolution Profile
* Assertion Query/Request Profile
* Name Identifier Mapping Profile
* SAML Attribute Profiles
** Basic Attribute Profile
** X.500/LDAP Attribute Profile
** UUID Attribute Profile
** DCE PAC Attribute Profile
** XACML Attribute Profile

サポートされているプロファイルの数は非常に多いものの、各プロファイルのバインディング面が別のBindings仕様（SAMLBind）に集約されているため、Profiles仕様（SAMLProf）は簡素化されている。

### WebブラウザSSOプロファイル

SAML&nbsp;2.0は、アイデンティティプロバイダ (IdP)、サービスプロバイダ (SP)、およびHTTPユーザー・エージェントを操るプリンシパルを含む「WebブラウザSSOプロファイル」を規定している。 サービスプロバイダには4つのバインディングがあり、アイデンティティプロバイダには3つのバインディングがあるため、12の展開シナリオが考えられる。 以下では、これらの展開シナリオのうち3つを概説する。

#### SPリダイレクトリクエスト; IdP POST レスポンス
これは、最も一般的なシナリオの1つである。サービスプロバイダは、HTTPリダイレクト・バインディングを使用して、SAMLリクエストをIdP SSOサービスに送信する。アイデンティティプロバイダは、HTTP-POST バインディングを使用してSAMLレスポンスをSPアサーション・ コンシューマー・サービスに返す。

メッセージのフローは、サービスプロバイダのセキュアなリソースに対するリクエストから始まる。

**1. SPにターゲット・リソースをリクエスト**

プリンシパルは、（HTTPユーザーエージェントを介して）サービスプロバイダにターゲットリソースを要求する。

  

サービスプロバイダは、ターゲット・リソースに代わってセキュリティ・チェックを実行する。 サービスプロバイダに有効なセキュリティコンテキストがすでに存在する場合は、ステップ2&ndash;7をスキップする。

サービスプロバイダは、使用するアイデンティティプロバイダを発見するために、あらゆる種類のメカニズムを使用する。例：ユーザに尋ねる、事前に設定された IdP を使用する、など。

**2. IdP SSO サービスにリダイレクト**

サービスプロバイダは、適切な SAMLRequest（およびあればRelayState）を生成し、標準的な HTTP 302リダイレクトを使用してブラウザを IdP SSO サービスにリダイレクトする。


```http
302 Redirect
Location: https://idp.example.org/SAML2/SSO/Redirect?SAMLRequest=request&RelayState=token
```


`RelayState`トークンは、サービスプロバイダで保持している状態情報への不透明な参照である。 `SAMLRequest`パラメータの値は、`<samlp:AuthnRequest>`要素のdeflate、base64エンコード、URLエンコードされた値である。


```xml
<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>https://sp.example.com/SAML2</saml:Issuer>
    <samlp:NameIDPolicy
      AllowCreate="true"
      Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
  </samlp:AuthnRequest>
```


SAMLRequest は、SP の署名鍵を用いて署名することができる。しかし、通常はその必要はない。

**3. IdPへのSSOサービスのリクエスト**

ユーザ・エージェントは、アイデンティティプロバイダのSSOサービスにGETリクエストを発行する：


```http
GET /SAML2/SSO/Redirect?SAMLRequest=request&RelayState=token HTTP/1.1
Host: idp.example.org
```


ここで、`SAMLRequest`および`RelayState`パラメータの値は、リダイレクトで提供されたものと同じである。アイデンティティプロバイダのSSOサービスは、`<samlp:AuthnRequest>`要素を処理して（URL復号、Base64復号、リクエストのinflateの順に行う）、セキュリティチェックを実行する。 ユーザーが有効なセキュリティ・コンテキストを持っていない場合、アイデンティティプロバイダは任意のメカニズムでユーザーを識別する（詳細は省略）。

**4. XHTMLフォームで回答する**

SSOサービスはリクエストを検証し、XHTMLフォームを含むドキュメントで応答する。


```html
<form method="post" action="https://sp.example.com/SAML2/SSO/POST" ...>
    <input type="hidden" name="SAMLResponse" value="response" />
    <input type="hidden" name="RelayState" value="token" />
    ...
    <input type="submit" value="Submit" />
  </form>
```


`RelayState`パラメータの値は、ステップ&nbsp;3から保存されている。 `SAMLResponse`パラメータの値は、次の`<samlp:Response>`要素のbase64エンコーディングである：


```xml
<samlp:Response
    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
    ID="identifier_2"
    InResponseTo="identifier_1"
    Version="2.0"
    IssueInstant="2004-12-05T09:22:05Z"
    Destination="https://sp.example.com/SAML2/SSO/POST">
    <saml:Issuer>https://idp.example.org/SAML2</saml:Issuer>
    <samlp:Status>
      <samlp:StatusCode
        Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
    </samlp:Status>
    <saml:Assertion
      xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
      ID="identifier_3"
      Version="2.0"
      IssueInstant="2004-12-05T09:22:05Z">
      <saml:Issuer>https://idp.example.org/SAML2</saml:Issuer>
      
      <ds:Signature
        xmlns:ds="http://www.w3.org/2000/09/xmldsig#">...</ds:Signature>
      <saml:Subject>
        <saml:NameID
          Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">
          3f7b3dcf-1674-4ecd-92c8-1544f346baf8
        </saml:NameID>
        <saml:SubjectConfirmation
          Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
          <saml:SubjectConfirmationData
            InResponseTo="identifier_1"
            Recipient="https://sp.example.com/SAML2/SSO/POST"
            NotOnOrAfter="2004-12-05T09:27:05Z"/>
        </saml:SubjectConfirmation>
      </saml:Subject>
      <saml:Conditions
        NotBefore="2004-12-05T09:17:05Z"
        NotOnOrAfter="2004-12-05T09:27:05Z">
        <saml:AudienceRestriction>
          <saml:Audience>https://sp.example.com/SAML2</saml:Audience>
        </saml:AudienceRestriction>
      </saml:Conditions>
      <saml:AuthnStatement
        AuthnInstant="2004-12-05T09:22:00Z"
        SessionIndex="identifier_3">
        <saml:AuthnContext>
          <saml:AuthnContextClassRef>
            urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
         </saml:AuthnContextClassRef>
        </saml:AuthnContext>
      </saml:AuthnStatement>
    </saml:Assertion>
  </samlp:Response>
```


**5. SPにアサーション・コンシューマー・サービスを要求する**

ユーザ・エージェントは、サービスプロバイダのアサーション・コンシューマー・サービスにPOSTリクエストを発行する。


```http
POST /SAML2/SSO/POST HTTP/1.1
Host: sp.example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: nnn
 
SAMLResponse=response&RelayState=token
```


ここで、`SAMLResponse`および`RelayState`パラメータの値は、ステップ&nbsp;4のXHTMLフォームから取得される。

**6. ターゲット・リソースにリダイレクト**

アサーション・コンシューマー・サービスは、レスポンスを処理し、サービスプロバイダでセキュリティ・ コンテキストを作成し、ユーザ・エージェントをターゲット・リソースにリダイレクトする。

**7. SPにターゲット・リソースを再リクエスト**

ユーザーエージェントは、サービスプロバイダにターゲット・リソースをリクエストする（再度）：

  

**8. 要求されたリソースを応答する**

セキュリティ・コンテキストが存在するので、サービスプロバイダはリソースをユーザエージェントに返す。

#### SP POST リクエスト; IdP POST レスポンス

これは、SAML&nbsp;2.0 WebブラウザSSOプロファイル (SAMLProf) を比較的簡単に導入したもので、サービスプロバイダ (SP) とアイデンティティプロバイダ (IdP) の両方がHTTP POSTバインディングを使用している。

メッセージ・フローは、SPのセキュアなリソースへのリクエストから始まる。

**1. SPでターゲット・リソースをリクエスト**

プリンシパルは、（HTTPユーザーエージェントを介して）サービスプロバイダにターゲットリソースを要求する：

  

サービスプロバイダは、ターゲット・リソースに代わってセキュリティ・チェックを実行する。 サービスプロバイダに有効なセキュリティコンテキストがすでに存在する場合は、ステップ2&ndash;7をスキップする。

**2. XHTMLフォームで回答する**

サービスプロバイダは、XHTMLフォームを含むドキュメントで応答する：

```html
<form method="post" action="https://idp.example.org/SAML2/SSO/POST" ...>
    <input type="hidden" name="SAMLRequest" value="request" />
    <input type="hidden" name="RelayState" value="token" />
    ...
    <input type="submit" value="Submit" />
  </form>
```


`RelayState`トークンは、サービスプロバイダで保持している状態情報への不透明な参照である。 `SAMLRequest`パラメータの値は、以下の`<samlp:AuthnRequest>`要素のbase64エンコーディングである。


```xml
<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>https://sp.example.com/SAML2</saml:Issuer>
    <samlp:NameIDPolicy
      AllowCreate="true"
      Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
  </samlp:AuthnRequest>
```

`<samlp:AuthnRequest>`要素がXHTMLフォームに挿入される前に、まずbase64エンコードされる。

**3.IdP での SSO サービスのリクエスト**

ユーザーエージェントは、アイデンティティプロバイダの SSO サービスに POST リクエストを発行する：


```http
POST /SAML2/SSO/POST HTTP/1.1
Host: idp.example.org
Content-Type: application/x-www-form-urlencoded
Content-Length: nnn

SAMLRequest=request&RelayState=token
```


ここで、`SAMLRequest`および`RelayState`パラメータの値は、ステップ&nbsp;2のXHTMLフォームから取得される。SSOサービスは、`<samlp:AuthnRequest>`要素を処理して（リクエストのURLデコード、base64デコード、inflateの順に行う）、セキュリティ・チェックを実行する。 ユーザが有効なセキュリティ・コンテキストを持っていない場合、アイデンティティプロバイダはユーザを識別する（詳細は省略）。

**4. XHTMLフォームで応答する**

SSOサービスはリクエストを検証し、XHTMLフォームを含むドキュメントで応答する:

```html
<form method="post" action="https://sp.example.com/SAML2/SSO/POST" ...>
    <input type="hidden" name="SAMLResponse" value="response" />
    <input type="hidden" name="RelayState" value="token" />
    ...
    <input type="submit" value="Submit" />
  </form>
```

`RelayState`パラメータの値は、ステップ&nbsp;3から保存されている。 `SAMLResponse`パラメータの値は、次の`<samlp:Response>`要素のbase64エンコーディングである:


```xml
<samlp:Response
    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
    ID="identifier_2"
    InResponseTo="identifier_1"
    Version="2.0"
    IssueInstant="2004-12-05T09:22:05Z"
    Destination="https://sp.example.com/SAML2/SSO/POST">
    <saml:Issuer>https://idp.example.org/SAML2</saml:Issuer>
    <samlp:Status>
      <samlp:StatusCode
        Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
    </samlp:Status>
    <saml:Assertion
      xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
      ID="identifier_3"
      Version="2.0"
      IssueInstant="2004-12-05T09:22:05Z">
      <saml:Issuer>https://idp.example.org/SAML2</saml:Issuer>
      
      <ds:Signature
        xmlns:ds="http://www.w3.org/2000/09/xmldsig#">...</ds:Signature>
      <saml:Subject>
        <saml:NameID
          Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">
          3f7b3dcf-1674-4ecd-92c8-1544f346baf8
        </saml:NameID>
        <saml:SubjectConfirmation
          Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
          <saml:SubjectConfirmationData
            InResponseTo="identifier_1"
            Recipient="https://sp.example.com/SAML2/SSO/POST"
            NotOnOrAfter="2004-12-05T09:27:05Z"/>
        </saml:SubjectConfirmation>
      </saml:Subject>
      <saml:Conditions
        NotBefore="2004-12-05T09:17:05Z"
        NotOnOrAfter="2004-12-05T09:27:05Z">
        <saml:AudienceRestriction>
          <saml:Audience>https://sp.example.com/SAML2</saml:Audience>
        </saml:AudienceRestriction>
      </saml:Conditions>
      <saml:AuthnStatement
        AuthnInstant="2004-12-05T09:22:00Z"
        SessionIndex="identifier_3">
        <saml:AuthnContext>
          <saml:AuthnContextClassRef>
            urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
         </saml:AuthnContextClassRef>
        </saml:AuthnContext>
      </saml:AuthnStatement>
    </saml:Assertion>
  </samlp:Response>
```

**5. SPにアサーション・コンシューマー・サービスを要求する**

ユーザ・エージェントは、サービスプロバイダのアサーション・コンシューマ・サービスに POST リクエストを発行する。


```http
POST /SAML2/SSO/POST HTTP/1.1
Host: sp.example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: nnn
 
SAMLResponse=response&RelayState=token
```


ここで、`SAMLResponse`および`RelayState`パラメータの値は、ステップ&nbsp;4のXHTMLフォームから取得される。

**6. ターゲット・リソースへのリダイレクト**

アサーション・コンシューマー・サービスは、レスポンスを処理し、サービスプロバイダでセキュリティ・ コンテキストを作成し、ユーザ・エージェントをターゲット・リソースにリダイレクトする。

**7. SPに対象のリソースを再リクエスト**

ユーザーエージェントは、サービスプロバイダにターゲット・リソースをリクエストする（再度）。

  

**8. 要求されたリソースで応答する**

セキュリティコンテキストが存在するため、サービスプロバイダはリソースをユーザーエージェントに返す。

#### SP リダイレクト・アーティファクト; IdP リダイレクト・アーティファクト
これは、SAML&nbsp;2.0 Web Browser SSO Profile（SAMLProf）の複雑な展開であり、サービスプロバイダ (SP) とアイデンティティプロバイダ (IdP) の両方がHTTPアーティファクト・バインディングを使用している。 両方のアーティファクトは、HTTP GET でそれぞれのエンドポイントに配信される。

メッセージの流れは、SPのセキュアなリソースへのリクエストから始まる：

**1. SPでターゲット・リソースをリクエスト**

プリンシパルは、（HTTPユーザーエージェントを介して）サービスプロバイダにターゲットリソースを要求する：

  

サービスプロバイダは、ターゲットリソースに代わって、セキュリティ チェックを実行する。 サービスプロバイダに有効なセキュリティコンテキストがすでに存在する場合は、ステップ2&ndash;11をスキップする。

**2. IdPのシングルサインオン (SSO) サービスへのリダイレクト**

サービスプロバイダは、ユーザーエージェントをアイデンティティプロバイダのシングルサインオン (SSO) サービスにリダイレクトする。 リダイレクトURLには、`RelayState`パラメータと`SAMLart`パラメータが付加される。

**3. IdPへのSSOサービスのリクエスト**

ユーザ・エージェントは、アイデンティティプロバイダにSSOサービスを要求する。

  ?SAMLart=*artifact_1*&RelayState=*token*

ここで、`''token''`は、サービスプロバイダで保持されている状態情報への不透明な参照であり、`''artifact_1''`は、SAMLアーティファクトであり、いずれもステップ&nbsp;2で発行されたものである。

**4. SPでアーティファクト・レゾリューション・サービスをリクエスト**

SSOサービスは、SAML SOAPメッセージにバインドされた`<samlp:ArtifactResolve>`要素をサービスプロバイダのアーティファクト解決サービスに送信することで、アーティファクトの参照先を見に行く（dereference）。


```xml
<samlp:ArtifactResolve
    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:58Z"
    Destination="https://sp.example.com/SAML2/ArtifactResolution">
    <saml:Issuer>https://idp.example.org/SAML2</saml:Issuer>
    
    <ds:Signature
      xmlns:ds="http://www.w3.org/2000/09/xmldsig#">...</ds:Signature>
    <samlp:Artifact>''artifact_1''</samlp:Artifact>
  </samlp:ArtifactResolve>
```

ここで、`<samlp:Artifact>`要素の値は、ステップ3で送信されたSAMLアーティファクトである。

**5. SAML AuthnRequestで応答**

サービスプロバイダのアーティファクト解決サービスは、SAML SOAPメッセージにバインドされた`<samlp:ArtifactResponse>`要素（`<samlp:AuthnRequest>`要素を含む）を、アイデンティティプロバイダのSSOサービスに返す：

```xml
<samlp:ArtifactResponse
    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
    ID="identifier_2"
    InResponseTo="identifier_1"
    Version="2.0"
    IssueInstant="2004-12-05T09:21:59Z">
    
    <ds:Signature
      xmlns:ds="http://www.w3.org/2000/09/xmldsig#">...</ds:Signature>
    <samlp:Status>
      <samlp:StatusCode
        Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
    </samlp:Status>
    <samlp:AuthnRequest
      xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
      xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
      ID="identifier_3"
      Version="2.0"
      IssueInstant="2004-12-05T09:21:59Z"
      Destination="https://idp.example.org/SAML2/SSO/Artifact"
      ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact"
      AssertionConsumerServiceURL="https://sp.example.com/SAML2/SSO/Artifact">
      <saml:Issuer>https://sp.example.com/SAML2</saml:Issuer>
      <samlp:NameIDPolicy
        AllowCreate="false"
        Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"/>
    </samlp:AuthnRequest>
  </samlp:ArtifactResponse>
```


SSOサービスは、`<samlp:AuthnRequest>`要素を処理し、セキュリティチェックを行う。 ユーザーが有効なセキュリティ・コンテキストを持っていない場合、アイデンティティプロバイダはユーザーを識別する（詳細は省略）。

**6. アサーション・コンシューマー・サービスへのリダイレクト**

アイデンティティプロバイダの SSO サービスは、ユーザ・エージェントをサービスプロバイダのアサーション・コンシューマ・サービスにリダイレクトする。 以前の `RelayState` パラメータと新しい `SAMLart` パラメータがリダイレクト URL に追加される。

**7. SPにアサーション・コンシューマー・サービスを要求する**

ユーザ・エージェントは、サービスプロバイダにアサーション・コンシューマ・サービスを要求する：

  ?SAMLart=*artifact_2*&RelayState=*token*

ここで、`''token''`は、ステップ&nbsp;3のトークンの値であり、`''artifact_2''`は、ステップ&nbsp;6で発行されたSAMLアーティファクトである。

**8. IdP でアーティファクト解決サービスを要求する**

アサーション・コンシューマー・サービスは、SAML SOAPメッセージにバインドされた`<samlp:ArtifactResolve>`要素をアイデンティティプロバイダのアーティファクト解決サービスに送信することにより、アーティファクトを逆参照する：

```xml
<samlp:ArtifactResolve
    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
    ID="identifier_4"
    Version="2.0"
    IssueInstant="2004-12-05T09:22:04Z"
    Destination="https://idp.example.org/SAML2/ArtifactResolution">
    <saml:Issuer>https://sp.example.com/SAML2</saml:Issuer>
    
    <ds:Signature
      xmlns:ds="http://www.w3.org/2000/09/xmldsig#">...</ds:Signature>
    <samlp:Artifact>''artifact_2''</samlp:Artifact>
  </samlp:ArtifactResolve>
```


ここで、`<samlp:Artifact>`要素の値は、ステップ&nbsp;7で送信されたSAMLアーティファクトである。

**9. SAMLアサーションで応答**

アイデンティティプロバイダのアーティファクト解決サービスは、サービスプロバイダのアサーション・コンシューマ・サービスに、SAML SOAPメッセージにバインドされた`<samlp:ArtifactResponse>`要素（`<samlp:Response>`要素を含む）を返す：

```xml
<samlp:ArtifactResponse
    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
    ID="identifier_5"
    InResponseTo="identifier_4"
    Version="2.0"
    IssueInstant="2004-12-05T09:22:05Z">
    
    <ds:Signature
      xmlns:ds="http://www.w3.org/2000/09/xmldsig#">...</ds:Signature>
    <samlp:Status>
      <samlp:StatusCode
        Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
    </samlp:Status>
    <samlp:Response
      xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
      xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
      ID="identifier_6"
      InResponseTo="identifier_3"
      Version="2.0"
      IssueInstant="2004-12-05T09:22:05Z"
      Destination="https://sp.example.com/SAML2/SSO/Artifact">
      <saml:Issuer>https://idp.example.org/SAML2</saml:Issuer>
      <ds:Signature
        xmlns:ds="http://www.w3.org/2000/09/xmldsig#">...</ds:Signature>
      <samlp:Status>
        <samlp:StatusCode
          Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
      </samlp:Status>
      <saml:Assertion
        xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
        ID="identifier_7"
        Version="2.0"
        IssueInstant="2004-12-05T09:22:05Z">
        <saml:Issuer>https://idp.example.org/SAML2</saml:Issuer>
        
        <saml:Subject>
          <saml:NameID
            Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">
            user@mail.example.org
          </saml:NameID>
          <saml:SubjectConfirmation
            Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
            <saml:SubjectConfirmationData
              InResponseTo="identifier_3"
              Recipient="https://sp.example.com/SAML2/SSO/Artifact"
              NotOnOrAfter="2004-12-05T09:27:05Z"/>
          </saml:SubjectConfirmation>
        </saml:Subject>
        <saml:Conditions
          NotBefore="2004-12-05T09:17:05Z"
          NotOnOrAfter="2004-12-05T09:27:05Z">
          <saml:AudienceRestriction>
            <saml:Audience>https://sp.example.com/SAML2</saml:Audience>
          </saml:AudienceRestriction>
        </saml:Conditions>
        <saml:AuthnStatement
          AuthnInstant="2004-12-05T09:22:00Z"
          SessionIndex="identifier_7">
          <saml:AuthnContext>
            <saml:AuthnContextClassRef>
              urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
           </saml:AuthnContextClassRef>
          </saml:AuthnContext>
        </saml:AuthnStatement>
      </saml:Assertion>
    </samlp:Response>
  </samlp:ArtifactResponse>
```


**10. ターゲット・リソースへのリダイレクト**

アサーション・コンシューマー・サービスは、レスポンスを処理し、サービスプロバイダでセキュリティ・コンテキス トを作成し、ユーザ・エージェントをターゲット・リソースにリダイレクトする。

**11. SPでターゲット・リソースを再度要求する**

ユーザ・エージェントは、サービスプロバイダでターゲット・リソースを（再度）要求する：

  

**12. 要求されたリソースで応答する**

セキュリティ・コンテキストが存在するので、サービスプロバイダはリソースをユーザエージェントに返す。

### アイデンティティプロバイダのディスカバリー・プロファイル

SAML&nbsp;2.0 *Identity Provider Discovery Profile*は、以下の概念を導入している：

* **共通ドメイン (Common Domain)**
* **共通ドメインクッキー (Common Domain Cookie)**
* **共通ドメインクッキー書き込みサービ (Common Domain Cookie Writing Service)**
* **共通ドメインクッキー読み取りサービス (Common Domain Cookie Reading Service)**

「共通ドメイン」の架空の例として、Example UK (example.co.uk) とExample Deutschland (example.de) が仮想組織Example Global Alliance (example.com) に属しているとする。 この例では、ドメイン**example.com**が共通ドメインである。 Example UKとExample Deutschlandの両方がこのドメインに存在しているとする（それぞれ、uk.example.comとde.example.com）。

「共通ドメインクッキー」は、共通ドメインにスコープされた安全なブラウザ・クッキーである。 このクッキーは、各ブラウザユーザが最近訪問したIdPの履歴リストを保存する。 クッキーの名前と値は，IdPディスカバリー・プロファイル（SAMLProf）で指定される。

認証に成功すると、IdP は「共通ドメインクッキー書き込みサービス」を要求する。 このサービスは、共通ドメインクッキーにIdPの固有識別子を付加する。 SP は，保護されたリソースに対する認証されていないリクエストを受け取ると、ブラウザユーザが直近に使用した IdP を発見するために、「共通ドメイン・クッキー読み取りサービス」を要求する。

### アサーション問い合わせ/要求プロファイル
「アサーション問い合わせ/要求プロファイル」は、次のSAML&nbsp;2.0要素を使用した多数のタイプのいわゆる「クエリ」に対応する一般的なプロファイルである。

* `<samlp:AssertionIDRequest>`要素は、一意の識別子 (`ID`) を指定してアサーションを要求するのに使用される。
* `<samlp:SubjectQuery>`要素は、新しいサブジェクトベースのSAMLクエリを定義できる抽象的な拡張ポイントである。
* `<samlp:AuthnQuery>`要素は、認証局に特定のサブジェクトに関する**既存の**認証アサーションを要求するために使用される。
* `<samlp:AttributeQuery>`要素は、与えられたサブジェクトに関する属性を属性機関（Attribute Authority）に要求するために使用される。
* `<samlp:AuthzDecisionQuery>` 要素は、信頼されたサードパーティに認可決定を要求するために使用される。

SAML SOAP バインディングは、しばしばクエリと組み合わせて使用される。

#### SAML属性クエリ
「属性クエリ」 は、おそらく SAML クエリの最も重要なタイプである。 多くの場合、プリンシパルに代わって行動するリクエスターが、アイデンティティプロバイダに属性を問い合わせる。 以下では、プリンシパルが直接発行したクエリの例を示す：

```xml
<samlp:AttributeQuery
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
    ID="aaf23196-1773-2113-474a-fe114412ab72"
    Version="2.0"
    IssueInstant="2006-07-17T20:31:40Z">
    <saml:Issuer
      Format="urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName">
      CN=trscavo@uiuc.edu,OU=User,O=NCSA-TEST,C=US
    </saml:Issuer>
    <saml:Subject>
      <saml:NameID
        Format="urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName">
        CN=trscavo@uiuc.edu,OU=User,O=NCSA-TEST,C=US
      </saml:NameID>
    </saml:Subject>
    <saml:Attribute
      NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
      Name="urn:oid:2.5.4.42"
      FriendlyName="givenName">
    </saml:Attribute>
    <saml:Attribute
      NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
      Name="urn:oid:1.3.6.1.4.1.1466.115.121.1.26"
      FriendlyName="mail">
    </saml:Attribute>
  </samlp:AttributeQuery>
```


この場合、`Issuer`は`Subject`であることに注意する。 これは「属性セルフクエリ」と呼ばれることもある。アイデンティティプロバイダは、`<samlp:Response>`要素(表示せず)に包まれた以下のアサーションを返す場合もある：

```xml
<saml:Assertion
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
    ID="_33776a319493ad607b7ab3e689482e45"
    Version="2.0"
    IssueInstant="2006-07-17T20:31:41Z">
    <saml:Issuer>https://idp.example.org/SAML2</saml:Issuer>
    <ds:Signature>...</ds:Signature>
    <saml:Subject>
      <saml:NameID
        Format="urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName">
        CN=trscavo@uiuc.edu,OU=User,O=NCSA-TEST,C=US
      </saml:NameID>
      <saml:SubjectConfirmation
        Method="urn:oasis:names:tc:SAML:2.0:cm:holder-of-key">
        <saml:SubjectConfirmationData>
          <ds:KeyInfo>
            <ds:X509Data>
              
              <ds:X509Certificate>
  MIICiDCCAXACCQDE+9eiWrm62jANBgkqhkiG9w0BAQQFADBFMQswCQYDVQQGEwJV
  UzESMBAGA1UEChMJTkNTQS1URVNUMQ0wCwYDVQQLEwRVc2VyMRMwEQYDVQQDEwpT
  UC1TZXJ2aWNlMB4XDTA2MDcxNzIwMjE0MVoXDTA2MDcxODIwMjE0MVowSzELMAkG
  A1UEBhMCVVMxEjAQBgNVBAoTCU5DU0EtVEVTVDENMAsGA1UECxMEVXNlcjEZMBcG
  A1UEAwwQdHJzY2F2b0B1aXVjLmVkdTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
  gYEAv9QMe4lRl3XbWPcflbCjGK9gty6zBJmp+tsaJINM0VaBaZ3t+tSXknelYife
  nCc2O3yaX76aq53QMXy+5wKQYe8Rzdw28Nv3a73wfjXJXoUhGkvERcscs9EfIWcC
  g2bHOg8uSh+Fbv3lHih4lBJ5MCS2buJfsR7dlr/xsadU2RcCAwEAATANBgkqhkiG
  9w0BAQQFAAOCAQEAdyIcMTob7TVkelfJ7+I1j0LO24UlKvbLzd2OPvcFTCv6fVHx
  Ejk0QxaZXJhreZ6+rIdiMXrEzlRdJEsNMxtDW8++sVp6avoB5EX1y3ez+CEAIL4g
  cjvKZUR4dMryWshWIBHKFFul+r7urUgvWI12KbMeE9KP+kiiiiTskLcKgFzngw1J
  selmHhTcTCrcDocn5yO2+d3dog52vSOtVFDBsBuvDixO2hv679JR6Hlqjtk4GExp
  E9iVI0wdPE038uQIJJTXlhsMMLvUGVh/c0ReJBn92Vj4dI/yy6PtY/8ncYLYNkjg
  oVN0J/ymOktn9lTlFyTiuY4OuJsZRO1+zWLy9g==
              </ds:X509Certificate>
            </ds:X509Data>
          </ds:KeyInfo>
        </saml:SubjectConfirmationData>
      </saml:SubjectConfirmation>
    </saml:Subject>
    
    <saml:Conditions
      NotBefore="2006-07-17T20:31:41Z"
      NotOnOrAfter="2006-07-18T20:21:41Z">
    </saml:Conditions>
    <saml:AuthnStatement
      AuthnInstant="2006-07-17T20:31:41Z">
      <saml:AuthnContext>
        <saml:AuthnContextClassRef>
            urn:oasis:names:tc:SAML:2.0:ac:classes:TLSClient
        </saml:AuthnContextClassRef>
      </saml:AuthnContext>
    </saml:AuthnStatement>
    <saml:AttributeStatement>
      <saml:Attribute
        xmlns:x500="urn:oasis:names:tc:SAML:2.0:profiles:attribute:X500"
        x500:Encoding="LDAP"
        NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
        Name="urn:oid:2.5.4.42"
        FriendlyName="givenName">
        <saml:AttributeValue
          xsi:type="xs:string">Tom</saml:AttributeValue>
      </saml:Attribute>
      <saml:Attribute
        xmlns:x500="urn:oasis:names:tc:SAML:2.0:profiles:attribute:X500"
        x500:Encoding="LDAP"
        NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
        Name="urn:oid:1.3.6.1.4.1.1466.115.121.1.26"
        FriendlyName="mail">
        <saml:AttributeValue
          xsi:type="xs:string">trscavo@gmail.com</saml:AttributeValue>
      </saml:Attribute>
    </saml:AttributeStatement>
  </saml:Assertion>
```


先に示したBearerAssertionとは対照的に、このアサーションは、プリンシパルがアイデンティティプロバイダを認証するために使用した X.509 証明書の有効期間に対応する長い有効期間を持つ。 さらに、アサーションは署名されているため、ユーザーはこのアサーションを証明書利用者に提示することができ、ユーザーが対応する秘密鍵を所有している（これが「ホルダー・オブ・キー（鍵の所有者）」という名前の由来）ことを証明することができる限り、証明書利用者ははアサーションが本物であることを保証できる。

## SAML 2.0メタデータ
メタデータは、文字通り、SAMLを（うまく）機能させるものである。メタデータの重要な使用例には以下が含まれる：

* サービスプロバイダは、ブラウザ経由で アイデンティティプロバイダに `<samlp:AuthnRequest>` 要素を送信する準備をする。サービスプロバイダは、ID プロバイダが本物であり、ユーザのパスワードを phish しようとする悪質な ID プロバイダではないことをどのようにして知ることができるのか？サービスプロバイダは、認証要求を発行する前に、メタデータ内の信頼できる ID プロバイダのリストを参照する。

* 前述のシナリオでは、サービスプロバイダは認証要求を持ったユーザーをどこに送ればよいかを どうやって知るのか？サービスプロバイダは、メタデータ内の、信頼できる ID プロバイダの事前に取り決められたエンドポイントの場所を調べる。
* アイデンティティプロバイダは、ブラウザを介してサービスプロバイダから`<samlp:AuthnRequest>`要素を受け取る。アイデンティティプロバイダはどのようにして、サービスプロバイダが本物であり、ユーザーに関する個人を特定できる情報を採取しようとしている悪質なサービスプロバイダではないことを知るのか。ID プロバイダは、認証応答を発行する前に、メタデータ内の信頼できるサービスプロバイダのリストを参照する。
* 前述のシナリオでは、アイデンティティプロバイダはどのようにして SAML アサーションを暗号化し、信頼されたサービスプロバイダ（および信頼されたサービスプロバイダのみ）がアサーションを復号できるようにするのか。アイデンティティプロバイダは、メタデータ内のサービスプロバイダの暗号化証明書を使用してアサーションを暗号化する。
* 前述のシナリオを続けると、アイデンティティプロバイダは認証応答でユーザーをどこに送ればよいかをどのようにして知ることができるか。アイデンティティプロバイダは、メタデータ内の信頼できるサービスプロバイダの事前に取り決められたエンドポイントの場所を検索する。
* サービスプロバイダは、認証応答が信頼できるアイデンティティプロバイダから来たことをどのようにして知るのか。サービスプロバイダは、メタデータからアイデンティティプロバイダの公開鍵を使用して、アサーション上の署名を検証する。
* サービスプロバイダは、信頼できる アイデンティティプロバイダから受け取ったアーティファクトを解決する場所をどのように知るか。サービスプロバイダは、メタデータから アイデンティティプロバイダのアーティファクト解決サービスの事前に取り決められたエンドポイントの場所をメタデータから調べる。

メタデータは、アイデンティティプロバイダとサービスプロバイダ間の安全なトランザクションを保証する。メタデータが登場する前は、信頼情報は独自の方法で実装にエンコードされていた。現在では、信頼情報の共有は、標準的なメタデータによって促進される。SAML&nbsp;2.0は、エンティティが信頼プロセスを起動するために活用できる、明確に定義された相互運用可能なメタデータ・フォーマットを提供する。

### アイデンティティプロバイダのメタデータ
アイデンティティプロバイダは `<md:EntityDescriptor>` 要素で自身に関するデータを公開する：


```xml
<md:EntityDescriptor entityID="https://idp.example.org/SAML2" validUntil="2013-03-22T23:00:00Z"
    xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    
    
    <md:Organization>
      <md:OrganizationName xml:lang="en">Some Non-profit Organization of New York</md:OrganizationName>
      <md:OrganizationDisplayName xml:lang="en">Some Non-profit Organization</md:OrganizationDisplayName>
      <md:OrganizationURL xml:lang="en">https://www.example.org/</md:OrganizationURL>
    </md:Organization>
    <md:ContactPerson contactType="technical">
      <md:SurName>SAML Technical Support</md:SurName>
      <md:EmailAddress>mailto:saml-support@example.org</md:EmailAddress>
    </md:ContactPerson>
  </md:EntityDescriptor>
```


このエンティティ記述子については、以下の詳細に注意する：

* `entityID`属性は、エンティティのユニークな識別子である。
* `validUntil` 属性は、メタデータの失効日を示す。
* `<ds:Signature>`要素（簡略化のため省略）には、メタデータの真正性と完全性を保証するデジタル署名が含まれている。
* `<md:Organization>` 要素で識別される組織は、エンティティ記述子（SAMLMetaのセクション&nbsp;2.3.2）で記述された「エンティティに責任を持つ」組織であることを示しす。
* `<md:ContactPerson>`要素に含まれるコンタクト情報は、そのエンティティに責任を持つテクニカルコンタクトを特定するものである。複数のコンタクトやコンタクトタイプが可能である。SAMLMetaのセクション&nbsp;2.3.2.2を参照。。

定義上、アイデンティティプロバイダは、SAMLProfで指定されたSAML WebブラウザSSOプロファイルをサポートするSSOサービスを管理する。次のセクションで示す`<md:IDPSSODescriptor>`要素に記述されているアイデンティティプロバイダがその例である。

#### SSOサービスのメタデータ
アイデンティティプロバイダのSSOサービスは、`<md:IDPSSODescriptor>`要素で記述される：

```xml
<md:IDPSSODescriptor
    protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
    <md:KeyDescriptor use="signing">
      <ds:KeyInfo>...</ds:KeyInfo>
    </md:KeyDescriptor>
    <md:ArtifactResolutionService isDefault="true" index="0"
      Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP"
      Location="https://idp.example.org/SAML2/ArtifactResolution"/>
    <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</md:NameIDFormat>
    <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat>
    <md:SingleSignOnService
      Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
      Location="https://idp.example.org/SAML2/SSO/Redirect"/>
    <md:SingleSignOnService
      Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
      Location="https://idp.example.org/SAML2/SSO/POST"/>
    <md:SingleSignOnService
      Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact"
      Location="https://idp.example.org/SAML2/Artifact"/>
    <saml:Attribute
      NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
      Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.1"
      FriendlyName="eduPersonAffiliation">
      <saml:AttributeValue>member</saml:AttributeValue>
      <saml:AttributeValue>student</saml:AttributeValue>
      <saml:AttributeValue>faculty</saml:AttributeValue>
      <saml:AttributeValue>employee</saml:AttributeValue>
      <saml:AttributeValue>staff</saml:AttributeValue>
    </saml:Attribute>
  </md:IDPSSODescriptor>
```

前述のメタデータ要素は、アイデンティティプロバイダにおけるSSOサービスについて説明している。 この要素についての詳細は以下の通り：

* アイデンティティプロバイダのソフトウェアには、SAML署名鍵（秘密鍵）とバックチャネル TLS鍵（秘密鍵）のうち一方、もしくは両方が設定されている。対応する公開鍵は，IdP メタデータの `<md:KeyDescriptor use="sinking">` 要素に含まれる。簡潔にするため、キーマテリアルは、キーの記述子から省略されている。
* `<md:ArtifactResolutionService>`要素の`Binding`属性は、アーティファクト解決にSAML SOAPバインディング(SAMLBind)が使用されるべきことを示す。
* `<md:ArtifactResolutionService>`要素の`Location`属性は、「ダブル・アーティファクト」プロファイルのステップ&nbsp;8で使用される。
* `<md:ArtifactResolutionService>` 要素の `index` 属性の値は、SAMLタイプ&nbsp;0x0004 アーティファクトの構築において `EndpointIndex` として使用される。
* `<md:NameIDFormat>` 要素は、SSO サービスがどの SAML 名前識別子フォーマット (SAMLCore) をサポートしているかを示す。
* `<md:SingleSignOnService>` 要素の `Binding` 属性は、SAML&nbsp;2.0 Binding 仕様 (SAMLBind) で指定された標準 URIである。
* HTTP POST バインディングをサポートする `<md:SingleSignOnService>` 要素の `Location` 属性は、「double POST」プロファイルの step&nbsp;2 で使用される。
* HTTPアーティファクトバインディングをサポートする`<md.SingleSignOnService>`要素の`Location`属性は、「ダブル・アーティファクト」プロファイルのステップ&nbsp;2 で使用される。
* `<saml:Attribute>` 要素は、アイデンティティプロバイダが（ポリシーに基づいて）表明することを望んでいる属性を記述している。 `<saml:AttributeValue>`要素は、属性が取り得る値を列挙する。

このセクションの冒頭で述べたように、`Location`属性の値は、サービスプロバイダがSAMLメッセージをルーティングするために使用され、不正なアイデンティティプロバイダがman-in-the-middle attackを指揮する可能性を最小限に抑えることができる。

### サービスプロバイダのメタデータ
アイデンティティプロバイダと同様に、サービスプロバイダはそれ自体に関するデータを`<md：EntityDescriptor>`要素で公開する：


```xml
<md:EntityDescriptor entityID="https://sp.example.com/SAML2" validUntil="2013-03-22T23:00:00Z"
    xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    
    
    <md:Organization>
      <md:OrganizationName xml:lang="en">Some Commercial Vendor of California</md:OrganizationName>
      <md:OrganizationDisplayName xml:lang="en">Some Commercial Vendor</md:OrganizationDisplayName>
      <md:OrganizationURL xml:lang="en">https://www.example.com/</md:OrganizationURL>
    </md:Organization>
    <md:ContactPerson contactType="technical">
      <md:SurName>SAML Technical Support</md:SurName>
      <md:EmailAddress>mailto:saml-support@example.com</md:EmailAddress>
    </md:ContactPerson>
  </md:EntityDescriptor>
```


このエンティティ記述子についての詳細は次の通り：

* `entityID`属性は、エンティティのユニークな識別子である。
* `validUntil` 属性は、メタデータの失効日を示す。
* `<ds:Signature>`要素（簡略化のため省略）には、メタデータの真正性と完全性を保証するデジタル署名が含まれている。
* `<md:Organization>` 要素で識別される組織は、エンティティ記述子（SAMLMetaのセクション&nbsp;2.3.2）で記述された「エンティティに責任を持つ」組織であることを示している。
`<md:ContactPerson>`要素に含まれるコンタクト情報は、そのエンティティに責任を持つテクニカルコンタクトを特定する。複数のコンタクトやコンタクトタイプが可能である。SAMLMetaのセクション&nbsp;2.3.2.2を参照のこと。

定義上では、サービスプロバイダは、SAMLProfで指定されたSAML WebブラウザSSOプロファイルをサポートするアサーション・コンシューマー・サービスを管理する。 次のセクションで示す`<md:SPSSODescriptor>`要素で示されているサービスプロバイダが例として挙げられる。

#### アサーション・コンシューマー・サービスのメタデータ

アサーション コンシューマー サービスは、`<md:SPSSODescriptor>` 要素に含まれる：


```xml
<md:SPSSODescriptor
    protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
    <md:KeyDescriptor use="signing">
      <ds:KeyInfo>...</ds:KeyInfo>
    </md:KeyDescriptor>
    <md:KeyDescriptor use="encryption">
      <ds:KeyInfo>...</ds:KeyInfo>
    </md:KeyDescriptor>
    <md:ArtifactResolutionService isDefault="true" index="0"
      Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP"
      Location="https://sp.example.com/SAML2/ArtifactResolution"/>
    <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</md:NameIDFormat>
    <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat>
    <md:AssertionConsumerService isDefault="true" index="0"
      Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
      Location="https://sp.example.com/SAML2/SSO/POST"/>
    <md:AssertionConsumerService index="1"
      Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact"
      Location="https://sp.example.com/SAML2/Artifact"/>
    <md:AttributeConsumingService isDefault="true" index="1">
      <md:ServiceName xml:lang="en">Service Provider Portal</md:ServiceName>
      <md:RequestedAttribute
        NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
        Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.1"
        FriendlyName="eduPersonAffiliation">
      </md:RequestedAttribute>
    </md:AttributeConsumingService>
  </md:SPSSODescriptor>
```


`<md:SPSSODescriptor>` メタデータ要素に関する詳細は次の通り：

* サービスプロバイダのソフトウェアには、SAML 署名鍵（秘密鍵）とバックチャネル TLS 鍵（秘密鍵）のどちらか一方、もしくは両方が設定されている。対応する公開鍵は、SP メタデータの `<md:KeyDescriptor use="sinking">` 要素に含まれている。キー・マテリアルは、簡潔にするためにキーの記述子から省略されている。
* 同様に、サービスプロバイダのソフトウェアには、SAML 復号鍵（秘密鍵）が設定される。SAML暗号化鍵（公開鍵）は、SPメタデータの`<md:KeyDescriptor use="encryption">`要素に含まれる。キー・マテリアルは、簡潔にするためにキーの記述子から省略されている。
* `<md:AssertionConsumerService>`要素の`index`属性は、`<samlp:AuthnRequest>`要素の`AssertionConsumerServiceIndex`属性の値として使用される。
* `<md:AssertionConsumerService>`要素の`Binding`属性は、SAML&nbsp;2.0 Binding仕様（SAMLBind）で指定されている標準的なURIである。
* HTTP POSTバインディング（`index="0"`）をサポートする`<md:AssertionConsumerService>`要素の`Location`属性は、「double POST」プロファイルのステップ&nbsp;4で使用されている。
* HTTPアーティファクト・ バインディングをサポートする `<md:AssertionConsumerService>` 要素の`Location`属性 (index="1") は、"double artifact プロファイルのstep&nbsp;6で使用されている。
* `<md:AttributeConsumingService>`要素は、WebブラウザSSOと連動してサービスプロバイダにプッシュされる`<saml:AttributeStatement>`要素を形成するために、アイデンティティプロバイダが使用する。
* `<md:AttributeConsumingService>`要素の`index`属性は、`<samlp:AuthnRequest>`要素の`AttributeConsumingServiceIndex`属性の値として使用される。

このセクションの冒頭で述べたように、`Location`属性の値は、SAMLメッセージをルーティングするためにアイデンティティプロバイダによって使用され、これにより、不正なサービスプロバイダがman-in-the-middle attackを指揮する可能性を最小限に抑えることができる。

### メタデータの集約

前述の例では、各`<md:EntityDescriptor>`要素がデジタル署名されていることを示した。しかし、実際には、複数の`<md:EntityDescriptor>`要素が`<md:EntitiesDescriptor>`要素の下にまとめられ、集約された全体に単一のデジタル署名が施される：


```xml
<md:EntitiesDescriptor validUntil="2013-03-22T23:00:00Z"
    xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    
    <md:EntityDescriptor entityID="https://idp.example.org/SAML2">
      ...
    </md:EntityDescriptor>
    <md:EntityDescriptor entityID="https://sp.example.com/SAML2">
      ...
    </md:EntityDescriptor>
  </md:EntitiesDescriptor>
```


上記の`<md:EntitiesDescriptor>`要素についての詳細は次の通り：

* デジタル署名（簡潔にするために省略）は、集約されたメタデータ全体をカバーしている。
* `validUntil` XML属性は親要素に昇格し、失効日が各子要素に適用されることを意味している。
* XMLの名前空間宣言は、冗長な名前空間宣言を避けるために、親要素に昇格している。

通常、集約されたメタデータは、集約されたすべてのメタデータの整合性を保証する「フェデレーション」と呼ばれる、信頼できる第三者によって公開される。集約されたメタデータは非常に大きく、1つのアグリゲートにつき数百から数千のエンティティで構成されることがあることに注意する。

## 関連する項目

* Security Assertion Markup Language（SAML）
* SAML 1.1
* SAML metadata
* SAML-based products and services

* 連合アイデンティティ
* OpenID
* 

## 参照