多要素認証を使用した Exchange Online PowerShell の裏側

TechNet にも記載の通り、Exchange Online に接続する PowerShell で MFA が利用できるようになっています。
Remote PowerShell の制約で OAuth が使えなかったはずですが、動作を見るとどうも OAuth を使っているように見えます。
今回は内部動作を見てみたいと思います。

TechNet に従って Exchange 管理センターからモジュールをダウンロードすると、Microsoft Exchange Online PowerShell というアプリケーションがインストールされています。

このアプリケーションを起動すると PowerShell が起動して以下のような画面が表示されます。

記載の通り、標準では利用できない Connect-EXOPSSession コマンドが使用できるようです。
Get-Command コマンドでを使って Connect-EXOPSSession コマンドの内容を確認してみます。

どうやら Function として定義されているだけでまだモジュールの読み込みは行っていないようです。
その代わりに Connect-EXOPSSession コマンドを実行すると Microsoft.Exchange.Management.ExoPowershellModule.dll というモジュールを読み込み、その中で定義されている New-ExoPSSession コマンドを使って PSSession を作成して、インポートしています。
従来の PowerShell 接続と同じでやはり Remote PowerShell 接続を行っているようです。

試しに Connect-EXOPSSession コマンドを実行して接続してみると、TechNet に記載の通りおなじみのログイン画面が出てきて、Exchange Online に接続されます。
接続後に Get-Module コマンドを実行すると、モジュールが読み込まれているのが分かります。

モジュールのパスも確認できます。

試しにこのパスを覗いてみましょう。

Microsoft.Exchange.Management.ExoPowershellModule.dll 以外にも複数のファイルがあります。
CreateExoPSSession.ps1 の内容を見ると、これが Connect-EXOPSSession コマンドの正体だったことが分かります。

実行ファイルである Microsoft.Online.CSE.PSModule.Client.exe を ILSpy で開いてみると、PowerShell.exe を起動して CreateExoPSSession.ps1 を実行していることが分かります。
Microsoft Exchange Online PowerShell というアプリケーションの実体は Microsoft.Online.CSE.PSModule.Client.exe のようです。

Microsoft.IdentityModel.Clients.ActiveDirectory.dll と Microsoft.IdentityModel.Clients.ActiveDirectory.WindowsForms.dll は ADAL の DLL なので、やはり OAuth を使っていそうです。
New-ExoPSSession コマンドの内容の確認が必要なので、Microsoft.Exchange.Management.ExoPowershellModule.dll を ILSpy で開いてみます。
PowerShell Module を開発したことがある方ならわかりますが、ProcessRecord() が処理の実体です。

まずはここまでのところで ADAL を使ってアクセス トークンの取得が行われています。
やはり OAuth が使用されていることが確認できました。

アクセス トークンを取得した後の処理は以下のようになっていますが、なにやら不思議なことを行っています。

通常は Authorization ヘッダーに指定するはずのアクセス トークンが、PSCredential のパスワードとして使用されています。
また、通常の Exchange Online への接続の際には使用しない BasicAuthToOAuthConversion というクエリ パラメーターが追加で指定されています。
どうやらこのような指定を行って認証が行えるように、サーバー側で機能拡張が行われているようです。

OAuth over Basic Auth と言ったところでしょうか。
かなり強引な印象を受けますが、これがおそらく最善だったのでしょう。