ADFSが発行するトークンの中身を確認する方法(トラブルシューティング目的)


#はじめに

ADFSをIDプロバイダとして利用し、各種アプリケーションへのSSOを実現している環境において、以下のツールを用いて、ADFSが発行するトークンの中身を確認する方法について紹介します。ここでは、ADFSの構築経験または運用経験がある方を対象としております。本投稿で利用するツールは以下となります。


|ツール名|概要|
|:---:|:---:|
|Claims X-Ray|MSが提供するADFSのトラブルシューティングツール。ADFSが発行したトークンの中身に記載のクレームを確認することが可能|
|Fiddler|言わずと知れたフリーのWebデバッグツール。ここでは、ADFSが発行するトークンの中身を確認することを目的とする。

#Claims X-Rayの設定

1.以下のサイトにアクセス。
　https://adfshelp.microsoft.com/ClaimsXray/TokenRequest
2.下図の「relying Party Trust Management」をクリック。
<img width="961" alt="pic1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688695/2b697f29-c495-4b96-7cee-f2e57797f03d.png">
3.下図の、「Download」をクリックし、スクリプト(ClaimsXrayManager.ps1)をダウンロードする。
<img width="957" alt="pic2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688695/d55374a3-8dd2-5d07-dc27-a3f67aebeb16.png">
4.ダウンロードしたスクリプトをADFSのプライマリーノードにコピーする。
5.実行をすると、以下のような画面となる。Select Relying Partyで既存の証明書利用者信頼から一つを選択し、「Apply Changes」をクリックすると、Claims X-Rayという名前の証明書利用者信頼が追加され、そこに、上記で選択した証明書利用者信頼の発行規則がコピーされる。デフォルトは、「Default: issue all claims」となっとおり、既定で用意されている以下の発行変換規則が適用される。ここでは、デフォルトを利用して検証。
```x:[]=> issue(claim = x);```
<img width="430" alt="pic3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688695/5905719f-1c32-ecdb-4f58-2759df6d17a3.png">

6.ADFSの管理から証明書利用者信頼を確認すると、下図の通り、ClaimXrayが追加されたことが確認できます。
<img width="594" alt="pic4.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688695/88b1dd56-2399-2316-88b4-2cbc9a6d1ba4.png">

これで設定は完了となりますので、次は、実際にClaims X-Rayを使って、ADFSが発行したトークンのクレーム(要求)を確認してみます。

#クレーム(要求)を確認してみる
　　　　　　　　　　　　　　
1.以下のサイトに戻ります。
　https://adfshelp.microsoft.com/ClaimsXray/TokenRequest
2.「Federation instance」にフェデレーションサービス名を入力。ここでは、「Authentication type」でFormsを選択し、「Token request」でWS-FED(SAML 1.1)を選択する。「Force fresh authenication」にチェックをいれ、「Test Authentication」をクリック。 
<img width="754" alt="pic5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688695/79cf6ab0-ee55-ebdc-543b-10c7d9d4cb27.png">
3.ADFSの認証画面が表示されますので、AD上に存在するユーザーでサインインをします。
<img width="618" alt="pic8.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688695/9b0e3138-8346-b10d-dfd8-0818eccc4cba.png">
4.サインインをすると、以下のような画面となり、ADFSが発行したトークンのクレームを確認することができます。
<img width="754" alt="pic9.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688695/0a4d6b19-a08f-5fb8-18f1-398b87266d23.png">

カスタムのクレーム規則を作成した際などに、クレーム(要求)が正しく送られているかを確認することが可能となるため、トラブルシューティングなどの際に活用すると便利かと思います。次は、Fiddlerを利用して、ADFSが発行する生のトークンを見ていきます。
なお、Claims X-ray自体を利用しても、生のトークンを確認することが可能です。

#Fiddlerの設定

1.以下のサイトからFiddlerをダウンロードします。
　https://www.telerik.com/fiddler
  ※ここでは、Fiddler Classicを利用します。
2.ADFSの証明書利用者信頼(Relying Party)に登録したアプリケーション(ここでは、上記で設定したClaims C-Rayを用います。)にアクセスするPCに、Fiddlerをインストールします。
3.Fiddlerのインストールが完了したら、起動をし、https通信を復号化するための設定をします。
　・まずは、「Tools」→「Options」をクリックします。<img width="786" alt="pic6.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688695/af10aae5-0158-4a62-615f-d85d123d0f76.png">
　・「Decrypt HTTPS traffic」と「Ignore server certificates errors(unsafe)」
   　にチェックを入れ、「OK」をクリックします。
  <img width="788" alt="pic7.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688695/a464ebff-58bb-ebce-cb89-9d511f965cd7.png">

これで、設定は完了となりますので、実際に先ほどのClaims X-rayを利用して、ADFSが発行するトークンの中身を確認していきます。

#Fiddlerでトークンの中身を確認する。

1.Fiddlerを実行した状態で、先ほどのclaims X-Rayを利用して、認証をします。
  ※設定値は上記と同じものを用います。
2.認証が成功すると、ADFSがトークンを発行しますので、それをFiddlerで、下図の通り、キャプチャできていることを確認します。
<img width="608" alt="pic10.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688695/0347261c-e7c1-66d1-4c89-f2eb9a24dfab.png">
3.メモ帳にコピーすると以下のような感じです。。
<img width="653" alt="pic11.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688695/5d336329-9f64-7d30-403c-ee8b817d1275.png">

4.先ほど、Claims X-Rayで確認したクレームの情報などを確認することができます。
　例えば、"windowsaccountname"というクレームだと、以下の通りに情報が格納されています。

```
<saml:Attribute AttributeName="windowsaccountname" AttributeNamespace="http://schemas.microsoft.com/ws/2008/06/identity/claims"><saml:AttributeValue>FOO\testuser</saml:AttributeValue>
```
 また、電子署名についても記載されており、その部分を切り取り、.cer拡張子で保存をすると、ADFSのトークン署名証明書と拇印が一致していることも確認できます。

#備考

今回は、ID連携プロトコルとして、WS-Federationを用いましたが、SAMLを選択した場合でも同様に確認することが可能です。また、本検証では、認証方式としてForms認証を用いましたが、選択した認証方式によって、リクエストヘッダーの値は以下の通りとなります。

|認証方式|WS-Federation|SAML|
|:---:|:---:|:---:|
|Forms|wauth=urn:oasis:names`:tc`:SAML:1.0`:a`m:password|RequestAuthenticationContext=urn:oasis:names`:tc`:SAML:2.0ac:classes:Password
|Windows Integrated Authentication|wauth=urn:federation:authentication:windows|RequestedAuthenticationContext=urn:oasis:names`:tc`:SAML:2.0`:ac`:classes:Kerberos
|Certificate|wauth=urn:ietf:rfc:2246|RequestedAuthenticationContext=urn:oasis:names`:tc`:SAML:2.0`:ac`:classes:X509|
|Multifactor Authentication|wauth=http://schemas.microsoft.com/claims/multipleauthn|RequestedAuthenticationContext=http://schemas.microsoft.com/claims/multipleauthn