web-dev-qa-db-ja.com

OWINWs-Federationパッケージを使用してADFS3.0に対して認証します

認証にADアカウントを使用する必要があるMVCイントラネットサイトがあります。

ADFS 3.0(Win Server 2012 R2)をセットアップし、 this に従ってADFS証明書利用者信頼をセットアップしました。

This 他の投稿でWs-Federation OWINコンポーネントが紹介されているので、それを使用したいと思います。 Azure ADに接続する方法については触れていますが、ADFSについては触れていません。

構成プロパティ「MetadataAddress」と「Wtrealm」をADFSで構成したものと一致するように設定しようとしましたが、実行時にエラーが発生します。

A default value for SignInAsAuthenticationType was not found in IAppBuilder Properties. 
This can happen if your authentication middleware are added in the wrong order, or if one is missing.

私はこのエラーを取り除く適切な方法を探しています

15
oscarmorasu

ええ..私は同じ問題に遭遇しました。次の手順を実行するだけで、機能するはずです。

    app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType );

    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
       AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType
    });
27
LyphTEC

私はしばらくの間これに頭を悩ませようとしてきました、そして特に Lars KemmannTratcher のおかげで、これを行うための受け入れられた方法は次のとおりだと思います次のとおりです。

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

app.UseCookieAuthentication(
    new CookieAuthenticationOptions { }
);

app.UseWsFederationAuthentication(
    new WsFederationAuthenticationOptions
    {
        Wtrealm = ConfigurationManager.AppSettings["ida:Wtrealm"],
        MetadataAddress = ConfigurationManager.AppSettings["ida:FedMetadataURI"]
    }
);

WsFederationを機能させるためにデフォルトの認証タイプを「CookieAuthentication」として構成しているのは直感に反しているようですが、これらは実際にはミドルウェアの各部分を識別するために使用される単なる文字列です(これにより、同じタイプのミドルウェアを複数登録できます)たとえば)、次のように評価されます。

  • CookieAuthenticationDefaults.AuthenticationType = "クッキー"
  • WsFederationAuthenticationDefaults.AuthenticationType = "フェデレーション"

ここで起こっていることは、リクエストを認証するために「Cookies」というラベルの付いたミドルウェアをデフォルトで使用する必要があることをOWINに伝えていることです。次に、CookieAuthenticationミドルウェアを追加します(デフォルトでは、これはCookieAuthenticationDefaults.AuthenticationType値から「Cookies」というラベルが付けられています。したがって、設定するために追加のコードを記述する必要はありません)、最後に、FederationAuthenticationミドルウェア(これはWsFederationAuthenticationDefaults.AuthenticationType-つまり「Federation」というラベルが付いています)を追加します。私の理解では、FederationミドルウェアはCookieを利用しています。認証関連のCookieを管理するミドルウェア。

あとは、選択したときにミドルウェアを呼び出すようにアプリを構成するだけです。これは、次のようないくつかの方法で実現できます。

  • HTTP401応答を返すことによって
  • MVCコントローラーで[Authorize]属性を使用する
  • OWINコンテキストIAuthenticationManagerChallengeメソッドを呼び出す(フェデレーションミドルウェアのラベルを渡す)

私がこの質問をしたとき ここ 、ラースはすべての要求に対して認証を要求する方法のきちんとした例で答えました、そして私はそれを次のようにOWINパイプラインにバンドルしました:

app.Use(
    (context, continuation) =>
    {
        if (
            (context.Authentication.User != null) &&
            (context.Authentication.User.Identity != null) &&
            (context.Authentication.User.Identity.IsAuthenticated)
        )
        {
            return continuation();
        }
        else
        {
            context.Authentication.Challenge(WsFederationAuthenticationDefaults.AuthenticationType);

            return Task.Delay(0);
        }
    }
);

上記の最初の例では、WtrealmMetadataAddressを移動したことに注意してください。メンテナンスを容易にするために設定ファイルに値を追加します。これらは単純なアプリケーション設定です。

<appSettings>
    <add key="ida:Wtrealm" value="[app-uri]" />
    <add key="ida:FedMetadataURI" value="https://[adfs-server]/federationmetadata/2007-06/federationmetadata.xml" />
</appSettings>

これがお役に立てば幸いです。

14
Tom Tregenna

実際には、通常UseCookieAuthenticationメソッド呼び出しの前にあるこの行が欠落しているだけです。

app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

あなたの場合は

app.UseExternalSignInCookie(WsFederationAuthenticationDefaults.AuthenticationType);

これは、UseExternalSignInCookie(...)を呼び出したときに実際に実行されるものです。externalAuthenticationTypeは、文字列パラメーターとして渡すものです。

app.SetDefaultSignInAsAuthenticationType(externalAuthenticationType);
CookieAuthenticationOptions options = new CookieAuthenticationOptions();
options.AuthenticationType = externalAuthenticationType;
options.AuthenticationMode = AuthenticationMode.Passive;
options.CookieName = ".AspNet." + externalAuthenticationType;
options.ExpireTimeSpan = TimeSpan.FromMinutes(5.0);
app.UseCookieAuthentication(options);

したがって、設定しているのがAuthenticationTypeだけの場合は、UseExternalSignInCookieを呼び出すだけで安全です。

1
John C