OK、これを解決するのに何日もかかりましたが、これらは私がそれを実行するために行ったことです. やるべきことはまだたくさんあります。
前提条件:
- ドメインのどこかで実行されている ADFS 2.0 サービス。
- IIS 7 と自己署名証明書、またはドメイン全体で使用できる証明書。
- Identity and Access (バージョン 1.0.2) 拡張機能がインストールされた Visual Studio 2012。
- IIS で実行するように設定された MVC4 Web アプリケーション。
- https 経由でアクセスできるように、自己署名証明書がサイトに追加されていることを確認します。
- ADFS 2.0 サービスへのアクセスを許可するには、マシンのファイアウォール設定を微調整する必要がある場合があります。
開発ワークステーション上
MVC4 プロジェクトで
- Web プロジェクトを右クリックして、[ID とアクセス] ダイアログを開きます。
- [ビジネス ID プロバイダーを使用する (ADFS2 など)] を選択します。
- STS メタデータ ドキュメントへのパスを入力します。例: https://{ADFS SERVER へのパス}/FederationMetadata/2007-06/FederationMetadata.xml
- アプリケーションのレルムを入力します。例: https://{WEB APPLICATION URL}/
- 末尾のスラッシュが違いを生みます。
- これらの変更を受け入れて、ダイアログを終了します。
次のコードをプロジェクトに追加します
using System;
using System.IdentityModel.Services;
namespace NAMESPACE
{
public class FixedWsFederationAuthenticationModule : WSFederationAuthenticationModule
{
public override void RedirectToIdentityProvider(string uniqueId, string returnUrl, bool persist)
{
//This corrects WIF error ID3206 "A SignInResponse message may only redirect within the current web application:"
//First Check if the request url doesn't end with a "/"
if (!returnUrl.EndsWith("/"))
{
//Compare if Request Url +"/" is equal to the Realm, so only root access is corrected
//https://localhost/AppName plus "/" is equal to https://localhost/AppName/
//This is to avoid MVC urls
if (String.Compare(System.Web.HttpContext.Current.Request.Url.AbsoluteUri + "/", base.Realm, StringComparison.InvariantCultureIgnoreCase) == 0)
{
//Add the trailing slash
returnUrl += "/";
}
}
base.RedirectToIdentityProvider(uniqueId, returnUrl, persist);
}
}
}
ADFS 2.0 サーバー上
- 自己署名証明書を使用した場合は、Web アプリケーション https://{WEB APPLICATION URL}/ に移動し、ゾーンを信頼済みサイトに変更します。
- ブラウザのアドレスバーで、証明書を右クリックしてインストールできるはずです (信頼されたサイトからの証明書のみをインストールできます)。証明書は、信頼されたルート認証局 -> レジストリの下にインストールする必要があります。
- ADFS コンソールを開き、フェデレーション メタデータ アドレス https://{WEB APPLICATION URL}/FederationMetadata/2007-06/FederationMetadata.xml で Relying Party Trusts を追加します。
いくつかのカスタム ルールを追加する
MVC4 は、使用可能な ClaimsPrincipal を作成するためにこれらのルールを必要とします
Name プロパティにパススルー ルールを追加します。
そして、これらの 2 つのカスタム ルール
=> issue(Type = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", Value = "true");
=> issue(Type = "http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", Value = "true");