ASP.NET 5 beta 8中的Windows身份validation支持

我有一个ASP.NET 5 MVC 6 Web API项目。 大多数API端点都具有[Authorize]属性,并且在IIS和Visual Studio中项目的属性上都启用了Windows身份validation。 这一切在beta 7中运行良好。

然而,在测试版8中,这不起作用。 通过一个完全干净的项目很容易重现这个:

  1. 使用ASP.NET 5 Web API模板创建新项目。
  2. 获取项目的属性(不是解决方案),转到“调试”选项卡,启用Windows身份validation并禁用“匿名”。 保存更改。
  3. 按F5并让它尝试运行该项目。

结果:

尝试确定托管应用程序的DNX进程的进程ID时发生错误。

  1. 现在返回项目属性并启用Anonymous。 也启用Windows。 保存更改。
  2. 转到您的控制器并添加[Authorize]属性。
  3. 再次F5。

结果:

该项目启动,但Web API返回500.在“输出”窗口中注意:

Microsoft.AspNet.Mvc.Controllers.ControllerActionInvoker:警告:filter“Microsoft.AspNet.Mvc.Filters.AuthorizeFilter”上的请求授权失败。

发布到IIS时,该项目也不起作用。

正如beta 8 声明中所述,托管模型已经发生变化,IIS正在将请求传递给Kestrel。 “ 服务器”页面未提供任何Kestrel支持Windows身份validation的指示。 是否有一些技巧可以让Windows身份validation在beta 8中运行?

在使用IIS Express时,这似乎是Visual Studio调试工具中的已知错误 。 在修复之前,我发现的唯一解决方法是通过运行WebListener而不是IIS Express来进行调试。 要进行此设置,请在Startup.cs中的Configure方法中添加:

// If we're self-hosting, enable integrated authentication (if we're using // IIS, this will be done at the IIS configuration level). var listener = app.ServerFeatures.Get(); if (listener != null) { listener.AuthenticationManager.AuthenticationSchemes = AuthenticationSchemes.NTLM; } 

然后在project.json中添加weblistener cmd,如下所示:

 "commands": { "weblistener": "Microsoft.AspNet.Server.WebListener --config hosting.ini", "web": "Microsoft.AspNet.Server.Kestrel" }, 

……或类似的。 然后,如果使用weblistener配置文件而不是IIS Express(或在Kestrel下不支持NTLM的Web)进行调试,则应该能够在解决IIS Express工具错误时继续工作。 我相信,您需要将Microsoft.AspNet.Server.WebListener添加到project.json依赖项中以启用WebListener。

我发现,如果我直接在project.json中更改了“web”命令,Visual Studio会相当积极地将其更改回来,因此根据Microsoft团队的建议添加单独的命令似乎可以让所有人都满意。

有一个已知的工具错误,阻止您禁用“匿名身份validation”: https : //github.com/aspnet/Hosting/issues/419 。

重新启用它,您看到的问题应该消失。

确保你还添加了app.UseIISPlatformHandler(); 在您的Configure方法的早期:需要解析与IIS流动的令牌对应的Windows标识。

同样在web.config中你应该设置forwardWindowsAuthToken =“true”,例如: