カスタム多要素認証プロバイダーの作成(概要のみ)

ADFSの多要素認証には、デフォルトで証明書を利用した認証方法が実装されており、証明書を持っているユーザーだけがADFSを利用した認証ができるように構成する方法を紹介しました。

一方で、世の中の「多要素認証」や「二要素認証」などと呼ばれる機能の多くは、電話や携帯アプリを活用したものも多く、そうした機能をADFSと組み合わせて利用できませんか?という声を伺うこともあります。

そこで今回は、ADFSサーバーで行う多要素認証設定を証明書認証から

ワンタイムパスワードを活用したものに変更する方法に

image

変更する方法がTechNet Blogsで紹介されていたので、備忘録代わりに載せておきます。

■How to create a Custom Authentication Provider for Active Directory Federation Services on Windows Server 2012 R2
http://blogs.technet.com/b/cloudpfe/archive/2014/02/01/how-to-create-a-custom-authentication-provider-for-active-directory-federation-services-3-0-part-1.aspx

上記サイトで紹介しているワンタイムパスワードによる多要素認証はWindows Azureモバイルサービスを利用してワンタイムパスワードを生成し、Windows Phoneにテキストメッセージで配布するというものです。

確かに便利なのですが、現実的ではない設定なども含まれているので、
ここでは、より汎用的なものを作成できるように、ポイントとなる部分の整理をしておきます。

■ ■ ■

カスタム多要素認証プロバイダーのキモ

証明書認証以外の多要素認証(カスタム多要素認証プロバイダー)を定義する方法は、簡単に言ってしまえば、ADFSサーバーのc:windowsadfsフォルダーに保存されているMicrosoft.IdentityServer.web.dllファイルをカスタマイズすればよいのです。
では、どうやってdllファイルをカスタマイズするか?そこで、Visual Studioの出番となるわけです。

Visual Studioから多要素認証プロバイダーの作成

当ブログはIT Pro、いわゆるインフラ屋さんをターゲットとしているので、Visual Studioの利用に関しては細かい話はしません(世の中にもっと詳しい人がいると思うので、そうした方が紹介してくださることでしょう)。
そのため、上記サイトで紹介している内容については流れだけを挙げておきます。

1.ADFSサーバーからMicrosoft.IdentityServer.web.dllファイルをVisual Studioがインストールされたコンピューターにコピー

2.Visual Studioからクラスライブラリ(Visual C#)の新規プロジェクトを作成

3.参照の追加でMicrosoft.IdentityServer.web.dllファイルをプロジェクトに追加

4.AuthenticationAdapterという名前のクラスを追加

5.AuthenticationAdapter.csという名前のファイルができるので、AuthenticationAdapter.csファイルにサイトで紹介されているコードを追記

6.プロジェクトのビルド

7.Visual Studio付属のSNコマンドを使ってdllファイルに対する公開キートークンを作成

8.MyAuthenticationProvider.dllファイルをADFSサーバーにコピー

9.ADFSサーバーでdllファイルを登録

10.ADFSサーバーで多要素認証を有効

Windows Azure モバイルサービスの設定とWindows Phoneアプリを作成する前までの流れとしては以上です。汎用的に使えるのはここまでだと思うので、ここまでの部分に絞って内容を確認します。

まず、ここまでの設定でADFSサーバーを利用すると、多要素認証の機能により、PIN番号を入力することになります。この設定はコードの中に「決め打ち」で入っています。
以下に関連するコードを転記しておきます。

public IAdapterPresentation TryEndAuthentication(IAuthenticationContext
context, IProofData proofData, System.Net.HttpListenerRequest request, out System.Security.Claims.Claim[] claims)

{
claims = null;
IAdapterPresentation result = null;
string pin = proofData.Properties[“pin”].ToString();
if (pin == “12345”)

{
System.Security.Claims.Claim claim = new System.Security.Claims.Claim(“http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod”,http://schemas.microsoft.com/ws/2012/12/authmethod/otp”);
claims = new System.Security.Claims.Claim[] { claim };

}

  else { result = new AdapterPresentation(“Authentication failed.”, false);
}

return result;
}

PIN番号が12345になっていますが、この部分を変数にして、変数をランダムに生成する→何かしらの方法でユーザーに配布する、のような流れを実装できれば、ワンタイムパスワードとして活用できるようになります。

次に、ADFSサーバーにdllファイルを登録するところですが、私の環境ではgacutil.exeを使って登録を行いました。

gacutil.exe /i c:MyAuthenticationProvider.dll

その上で、Windows PowerShellから

$typeName = “MyAuthenticationProvider.AuthenticationAdapter,` MyAuthenticationProvider, Version=1.0.0.0, Culture=neutral,` PublicKeyToken=<公開キートークン番号>”

Register-AdfsAuthenticationProvider -TypeName $typeName `
-Name “MyAuthenticationProvider” -Verbose

と実行すれば、できあがり。

ADFSサービスを一度再起動して、

Restart-Service adfssrv

ADFSの管理ツールを開き、[認証ポリシー]の[多要素認証]の編集をクリックすると、認証プロバイダーが増えていることが確認できます。

image

そして、この状態でOffice365のサイトにアクセスしようとすると、

image

PIN番号を入力する画面が登場し、PIN番号を入力しないとOffice365のサイトにはアクセスできない状態になります。
(もちろん、Office365以外でもADFSを経由して各種サービスにアクセスすれば、どこでも利用可能です)

今回はPIN番号を決め打ちにしていますが、こんな形で実装しましたよ!などの情報があれば、ご一報いただけるとうれしいです。

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*