web-dev-qa-db-ja.com

ASP.NET Core 2.0 HttpSys Windows認証がAuthorize属性で失敗する(InvalidOperationException:No authenticationScheme was specified)

ASP.NET Core 1.1アプリケーションをASP.NET Core 2.0に移行しようとしています。

アプリケーションは非常にシンプルで、次のものが含まれます。

  • HttpSys(以前のWebListener)でホスト
  • Windows認証の使用:options.Authentication.Schemes = AuthenticationSchemes.NTLM
  • 匿名認証の許可:options.Authentication.AllowAnonymous = true(認証を必要としないコントローラーがあるため)
  • 認証が必要なコントローラーは、[Authorize]属性で装飾されています。

プロジェクトがコンパイルされ、正常に起動します。また、認証を必要としないコントローラーのアクションも提供します。

ただし、[Authorize]属性を持つコントローラーにヒットするとすぐに、次の例外が発生します。

System.InvalidOperationException: No authenticationScheme was specified,
and there was no DefaultChallengeScheme found.
   at Microsoft.AspNetCore.Authentication.AuthenticationService.<ChallengeAsync>d__11.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.ChallengeResult.<ExecuteResultAsync>d__14.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.<InvokeResultAsync>d__19.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.<InvokeFilterPipelineAsync>d__17.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.<InvokeAsync>d__15.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Builder.RouterMiddleware.<Invoke>d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.<Invoke>d__7.MoveNext()

プロジェクトテンプレートをいじり始めたところ、Windows認証を備えた標準テンプレートASP.NETコアWebアプリケーション(Model-View-Controller)を使用してこれを簡単に再現できることに気付きました。

Program.csファイルは次のように変更されました。

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseHttpSys(options =>
            {
                options.Authentication.Schemes = AuthenticationSchemes.NTLM;
                options.Authentication.AllowAnonymous = true;
                options.MaxConnections = 100;
                options.MaxRequestBodySize = 30000000;
                options.UrlPrefixes.Add("http://localhost:5000");
            })
            .UseStartup<Startup>()
            .Build();

これは HttpSys documentation から直接来ています。また、[Authorize]属性をHomeControllerクラスに追加しました。これで、示されているものとまったく同じ例外が生成されます。

関連するスタックオーバーフローの投稿をいくつか見つけました( herehere および here )、それらのどれもプレーンなWindows認証を処理しません(そして答えは一般化していないようです)。

18
Andreas

投稿を書いている間、移行ガイドの このサブセクション に出くわしたことを思い出しました。追加するように言っています

services.AddAuthentication(Microsoft.AspNetCore.Server.IISIntegration.IISDefaults.AuthenticationScheme);

ConfigureServices関数に。

最初は、定数の完全な名前を考えると、これはHttpSysには当てはまらないと考えていました(特にIISIntegrationは私を捨てました)。さらに、この記事の執筆時点では、 HttpSys documentation はこれについて完全に言及していません。

完全な.NET Frameworkを対象とする場合は、Microsoft.AspNetCore.Authentication NuGetパッケージ。

[〜#〜] edit [〜#〜]

Tratcherが指摘しているように、HttpSys名前空間には似たような定数があります。

Microsoft.AspNetCore.Server.HttpSys.HttpSysDefaults.AuthenticationScheme
26
Andreas

アンドレアスの答えは私を正しい道に導きましたが、これは私にとってうまくいったものです:

Microsoft.AspNetCore.Authenticationへのパッケージ参照を追加しました

そしてStartup.cs

using Microsoft.AspNetCore.Server.IISIntegration;

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddAuthentication(IISDefaults.AuthenticationScheme);
    ...
}
7
fiat

もう1つ、既にサービスを追加している場合は、AddAuthentication(IISDefaults.AuthenticationScheme);アプリ->認証の下にあるiisで認証タイプ(ウィンドウ、フォーム)をオンにしてください。私のものはすべて無効になっており、コードを配置してもこのエラーが発生していました。

1
joel1618