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