2012年3月17日土曜日

[FIM2010] R2 で強化されたパスワード管理機能 - その2


前回から時間があいてしまいました。前回は Web ベースでの QA ゲート(秘密の質問と答え)によるパスワードリセット機能を紹介しましたが、 FIM2010 R2 からは他にも、
・ワンタイム パスワードの電子メール ゲート
・ワンタイム パスワードの SMS ゲート
が新たに追加されています。

簡単に言うとあらかじめ登録した電子メールや SMS(携帯電話のテキストメッセージ)へワンタイムパスワードを通知し、そのワンタイムパスワードを利用してパスワードをリセットする、という機能です。

しかし、通常パスワードを忘れている環境では電子メールを見ることが出来ないことが多いと思いますので、今回は SMS への通知の機能の使い方を紹介します。
※参考URL)http://technet.microsoft.com/en-us/library/hh824692(v=ws.10).aspx

通常、SMS は携帯電話キャリアのネットワークに依存する世界なので電子メールと同じようにインターネット経由でメッセージを送信することが出来ません。
やり方としては、サーバにモデムを接続して公衆回線経由でメッセージを送信する、という方法と SMS プロバイダと呼ばれるインターネット経由での SMS 送信サービスを提供している業者のサービスを使う方法が考えられます。
今回は後者の SMS プロバイダのサービスを利用することにしました。

尚、FIM2010 R2 から SMS へメッセージを送信するには SMS プロバイダが公開しているメッセージ送信 API を利用することになるので SMS プロバイダを選択するときは API を提供しているかどうかを調べる必要があります。
また、先にも書きましたが携帯キャリアのネットワークに依存する話なので、 SMS プロバイダが利用したい携帯キャリアに対応しているかどうかについても調べる必要があります。

今回は「イージー SMS」という SMS プロバイダを試しに使ってみました。
ここは API を公開していますし、国内の携帯キャリアでは Docomo と Softbank に対応しています。
(1通のメッセージを送るのに50円ほどかかります)

さて、早速手順を紹介します。
(イージー SMS への登録手順は省略します。詳細は Web サイトを参照してください)


■準備作業
手順1.SmsServiceProvider.dllを作成する

 FIM2010 R2 から SMS メッセージを送信するには SMS プロバイダが提供している API を呼び出すためのクラスライブラリを作成する必要があります。

 FIM2010 R2 では SmsServiceProvider.dll という名前で DLL を作成し、そのライブラリが SendSms というメソッドを公開していれば良いので、まずはクラスライブラリを作成します。(今回はVisual Studio 2010 を使って作成しました)

 Visual Studio 2010 を開いてプロジェクトを作成します。
 プロジェクトは以下の様に作成します。
 ・.NET Framework 3.5(FIM2010 R2 が .NET Framework 3.5 で開発されているので)
 ・クラスライブラリ
 ・名称:SmsServiceProvider
 ・参照設定:FIMインストールメディア内に存在するMicrosoft.IdentityManagement.SmsServiceProviderContract.dll
  ※Service and Portal\Program Files\Microsoft Forefront Identity Manager\2010\Service\GAC以下に存在

 [プロジェクトの作成]



























 [参照設定]
































 イージー SMS を使う場合のコードは以下の様な形になります。
using System;
using System.Collections.Generic;
using Microsoft.IdentityManagement.SmsServiceProvider;
using System.Net;
using System.IO;

namespace SmsServiceProvider
{
    public class SmsServiceProvider : ISmsServiceProvider
    {

        public void SendSms(string mobileNumber,
                            string message,
                            Guid requestId,
                            Dictionary<string, object> deliveryAttributes)
        {
            StreamWriter writer = new StreamWriter("c:\\tmp\\SMSLog.txt");
            writer.WriteLine("開始");

            System.Collections.Specialized.NameValueCollection ps = new System.Collections.Specialized.NameValueCollection();
            ps.Add("recipient", mobileNumber);
            ps.Add("sender", "+81901234567"); // 送信元
            ps.Add("message", message);
            ps.Add("password", "xxxxx"); // イージー SMS の契約パスワード
            WebClient wc = new WebClient();

            try
            {
        // API KEY はイージー SMS 契約時に入手できる
                byte[] resData = wc.UploadValues(@"https://api.ezsms.biz/{API KEY}/messages/send/", ps);
                wc.Dispose();
                string[] a = System.Text.Encoding.UTF8.GetString(resData).Split('\n');
                Boolean flg = false;
                foreach (string str in a)
                {
                    writer.WriteLine(str);
                    // 結果取得
                    if (str.Contains("OK") == true)
                    {
                        flg = true;
                        break;
                    }
                }
                if (flg == false)
                {
                    // エラー
                    throw new Exception("Could not send SMS message.");
                }
            }
            catch (System.Net.WebException ex)
            {
                //HttpWebResponseを取得
                System.Net.HttpWebResponse errres =
                    (System.Net.HttpWebResponse)ex.Response;
                writer.WriteLine("SMSプロバイダへ接続できない");
                throw new Exception("Could not connect to the SMS Provider.");
            }
            finally
            {
                wc.Dispose();
                writer.Close();
            }
        }
    }
}


後はビルドして完成した DLL ファイルを FIM2010 R2 サーバの Service 以下に配置すれば OK です。
(デフォルトインストールで C:\Program Files\Microsoft Forefront Identity Manager\2010\Service 以下)


手順2.SMS Gateの有効化

 次は SMS ゲートを使う様に FIM2010 R2 を設定します。

 設定を行うのは管理ポリシールール(MPR)の Password Reset AuthN Workflow です。
 管理ポリシールールのワークフローから当該のワークフローを探して編集します。




























 アクティビティとして「ワンタイム パスワードの SMS ゲート」を追加します。SMS ゲートだけを使うのであれば他のゲートは消してしまっても構いません。


































 追加したアクティビティの設定を行います。今回はテストなのでそのまま保存をしました。


































これでサーバ側の設定作業は完了です。次はユーザ自身による通知先の設定です。


手順3.通知先携帯電話番号の登録(ユーザ自身による作業)

 ユーザ自身によりパスワード登録画面を開き、通知先の携帯電話番号を登録します。(イージー SMS の場合、国番号から電話番号を登録する必要があるので +81 から登録します)





















■リセットの実行
では、実際にリセットをしてみます。

パスワードリセット画面へアクセスし、ユーザ名を「ドメイン名\ユーザ名」という形で入力します。































次へ、をクリックすると携帯電話へメッセージが送信されます。












































メッセージ内のワンタイムパスワードを画面に入力します。































正しいコードを入力するとパスワードのリセット出来ます。

0 件のコメント: