ASP.NET Core 1.1アプリケーションをASP.NET Core 2.0に移行しようとしています。
アプリケーションは非常にシンプルで、次のものが含まれます。
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
クラスに追加しました。これで、示されているものとまったく同じ例外が生成されます。
関連するスタックオーバーフローの投稿をいくつか見つけました( here 、 here および here )、それらのどれもプレーンなWindows認証を処理しません(そして答えは一般化していないようです)。
投稿を書いている間、移行ガイドの このサブセクション に出くわしたことを思い出しました。追加するように言っています
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
アンドレアスの答えは私を正しい道に導きましたが、これは私にとってうまくいったものです:
Microsoft.AspNetCore.Authentication
へのパッケージ参照を追加しました
そしてStartup.cs
using Microsoft.AspNetCore.Server.IISIntegration;
public void ConfigureServices(IServiceCollection services)
{
...
services.AddAuthentication(IISDefaults.AuthenticationScheme);
...
}
もう1つ、既にサービスを追加している場合は、AddAuthentication(IISDefaults.AuthenticationScheme);アプリ->認証の下にあるiisで認証タイプ(ウィンドウ、フォーム)をオンにしてください。私のものはすべて無効になっており、コードを配置してもこのエラーが発生していました。