ASP.NET Core 2.0 HttpSys Windows身份validation失败并带有Authorize属性(InvalidOperationException:未指定authenticationScheme)

我正在尝试将ASP.NET Core 1.1应用程序迁移到ASP.NET Core 2.0。

该应用程序非常简单,涉及以下内容:

  • 主持HttpSys(原WebListener)
  • 使用Windows身份validation: options.Authentication.Schemes = AuthenticationSchemes.NTLM
  • 允许匿名身份validation: options.Authentication.AllowAnonymous = true (因为有些控制器不需要身份validation)
  • 需要身份validation的控制器使用[Authorize]属性进行修饰。

该项目编译并启动就好了。 它还提供不需要身份validation的控制器的操作。

但是,只要我使用[Authorize]属性命中控制器,就会出现以下exception:

 System.InvalidOperationException: No authenticationScheme was specified, and there was no DefaultChallengeScheme found. at Microsoft.AspNetCore.Authentication.AuthenticationService.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.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.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.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.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.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.d__7.MoveNext() 

我开始摆弄项目模板,并注意到我可以使用带有Windows身份validation的标准模板ASP.NET Core Web Application(模型 – 视图 – 控制器)轻松地重现这一点。

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() .Build(); 

这直接来自HttpSys文档 。 我HomeController [Authorize]属性添加到HomeController类。 现在,它将产生与所示完全相同的exception。

我发现了一些相关的Stack Overflowpost( 这里 , 这里和这里 ),但没有一个处理普通的Windows身份validation(答案似乎没有概括)。

在撰写post时,我记得遇到了迁移指南的这一小节 。 它说要添加

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

ConfigureServices函数。

我最初认为这不适用于HttpSys,因为常量的全名(特别是IISIntegration让我失望)。 此外,在撰写本文时, HttpSys文档完全没有提到这一点。

对于那些面向完整.NET Framework的用户,这需要安装Microsoft.AspNetCore.Authentication NuGet包。

编辑

正如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); ... }