WIFとADFS2.0を使用してシングルサインオンを行うサンプルWebアプリケーションを作成しました。動作確認したところ、ADFS2.0で認証されるときに下図のようにWindows 統合認証(Windows Integrated Authentication) を行う認証ダイアログが表示されました。

ADFS2.0の使用で、ローカルからアクセスされた場合は Windows 統合認証によって サインインを行おうとするらしいです。そうでない場合、フォーム認証、X509クライアント証明書認証、ベーシック認証の順で認証方法が選択されるようです。

Dynamics CRM 2011 でクレームベース認証を行うようにした場合、下図のようにフォーム画面で認証されたので、明示的に行わせる方法があるんだろうと思い、その方法を調べてみました。

方法1 ADFS2.0 の Web.config の localAuthenticationTypes を変更する

ADFS2.0の認証方法の候補は、下図の順番で決定されます。

Windows 統合認証、フォーム認証、X509クライアント証明書認証、Basic認証

これは、ADFS2.0 をセットアップされたときにインストールされる IIS のサイトのWeb.config (既定では、 C:\inetpub\adfs\ls\Web.config ) に記載されている localAuthenticationTypes 要素の内部に認証方法の一覧が設定されていますが、その先頭が Windows 統合認証を行うようになっているためです。

    <localAuthenticationTypes>
      <add name="Integrated" page="auth/integrated/" />
      <add name="Forms" page="FormsSignIn.aspx" />
      <add name="TlsClient" page="auth/sslclient/" />
      <add name="Basic" page="auth/basic/" />
    </localAuthenticationTypes>

そのため、Forms というタグを先頭に移動することで、 シングルサインオン時にフォーム画面で認証がされるようにできます。この方法によってフォームベースの認証を行うようにすると、ADFS2.0を使用するすべての Relying Party に影響します。

方法2 Webアプリ(証明書利用者, Relying Party)の Web.config の wsFederation 要素 のauthenticationType 属性を設定する

方法1では、ADFS2.0のWeb.configを変更して 認証方法 の選択の優先順を変更することにより、フォームベース認証を行うようにする方法をご紹介しました。この方法だとすべてのクレームベース認証を行うWebアプリケーションに影響が発生します。

方法2では、 クレーム認証を行うWebアプリケーションから ADFS2.0の認証画面にリダイレクトするときに認証方法を指定することでフォーム画面での認証を行うようにADFS2.0に指定する方法になります。

ADFS2.0に認証を行うようにクレームベース認証を行うWebアプリケーションがリダイレクトするURLのパラメータに wauth があります。このパラメタに認証方法を明示的に指定することでフォーム画面を使用した認証を行わすことができます。

手順は、 FedUtil.exe ツール実行後(Visual Studio から Add STS Reference を使用する場合など)にWeb.config に 作成される microsoft.identityModel 要素の子要素 service/federatedAuthentication/wsFederation要素にauthentication 属性を追加し、認証方法を指定する文字列を設定します。フォーム認証の場合は、 wsFederation 要素に次の属性を設定します。

authenticationType="urn:oasis:names:tc:SAML:1.0:am:password"

Windows 統合認証、 X509クライアント証明書認証、フォーム認証などの認証方法で指定できる文字列は次の通りです。

認証方法 wauth URI
ユーザー名とパスワードを使用した認証 urn:oasis:names:tc:SAML:1.0:am:password
SSL クライアント認証 urn:ietf:rfc:2246
Windows 統合認証 urn:federation:authentication:windows

方法3 WSFederationAuthenticationModule.RedirectingToIdentityProvider イベントを使用して動的にパラメタを注入する

Global.asax.cs の Application_Start メソッドで WSFederationAuthenticationModuleのRedirectingToIdentityProvider イベントハンドらを登録し、wauth を設定します。下記はwauth を設定する方法の一例です。オリジナルのリクエストのクエリパラメタにwauthがある場合はその文字列を設定しています。それ以外はユーザー名とパスワードを使用した認証を行うAuthenticationType を設定しています。ADFS2.0が既定の設定の場合、フォーム認証が行われます。

    using Microsoft.IdentityModel.Web;
    public class Global : System.Web.HttpApplication
    {

        protected void Application_Start(object sender, EventArgs e)
        {
            FederatedAuthentication.WSFederationAuthenticationModule.RedirectingToIdentityProvider += new EventHandler<RedirectingToIdentityProviderEventArgs>(WSFederationAuthenticationModule_RedirectingToIdentityProvider);
        }

        void WSFederationAuthenticationModule_RedirectingToIdentityProvider(object sender, RedirectingToIdentityProviderEventArgs e)
        {
            string wauth = HttpContext.Current.Request.QueryString["wauth"];
            if (!string.IsNullOrEmpty(wauth))
            {
                // リクエストされたURLのクエリ文字列から動的に認証方法を指定する例
                // クエリ文字列にwauth(認証方法)が指定されている場合は、その認証方法を使用する
                e.SignInRequestMessage.AuthenticationType = wauth;
            }
            else
            {
                // wauthがクエリ文字列に指定されない場合は ユーザー名とパスワードを使用する認証(フォーム認証になる) 
                e.SignInRequestMessage.AuthenticationType = "urn:oasis:names:tc:SAML:1.0:am:password";
            }
        }

    }

WSFederationAuthenticationModule については次のURLを参照してください。

WSFederationAuthenticationModule Class
http://msdn.microsoft.com/ja-jp/library/system.identitymodel.services.wsfederationauthenticationmodule.aspx

ADFS 2.0 の認証方法の選択や、設定値などの情報およびWIFを使用すてクレームベース認証を行うASP.NET アプリの 認証方法のコンフィグレーションを設定する方法については次のURLを参照してください。

Authentication Handler Overview (Specifying an Authentication Method in WS-Federation Passive Authentication 当たり参考になります)
http://msdn.microsoft.com/en-us/library/ee895365.aspx

Federated Authentication Configuration
http://msdn.microsoft.com/en-us/library/gg638729.aspx

 

説明は以上です。

日本語に説明するときにどう訳せばいいんだかよくわからないので説明文が拙いかもしれませんが、要は ADFS 2.0 の Web.config を変数するか Webアプリケーション側から STSに対して認証方法を wauth パラメタ経由で指定するか、動的にwauthを設定するかにより 認証方法を設定できるようにしています。

そのほかの情報として MSDN のページに ADFS2.0 のサインインページをカスタマイズするが記載されていたので、トップのリンクを掲載しておきます。

AD FS 2.0 Sign-In Pages Customization Overview
http://msdn.microsoft.com/en-us/library/ee895356.aspx