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

Bil*_*ill 6 c# asp.net asp.net-mvc asp.net-core-mvc asp.net-core

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

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

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

结果:

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

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

结果:

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

Microsoft.AspNet.Mvc.Controllers.ControllerActionInvoker:警告:过滤器"Microsoft.AspNet.Mvc.Filters.AuthorizeFilter"上的请求授权失败.

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

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

Mar*_*hes 3

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

// 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<WebListener>();
if (listener != null)
{
    listener.AuthenticationManager.AuthenticationSchemes = 
        AuthenticationSchemes.NTLM;
}
Run Code Online (Sandbox Code Playgroud)

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

"commands": {
  "weblistener": "Microsoft.AspNet.Server.WebListener --config hosting.ini",
  "web": "Microsoft.AspNet.Server.Kestrel"
},
Run Code Online (Sandbox Code Playgroud)

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

我发现,如果我直接在 project.json 中更改“web”命令,Visual Studio 会相当积极地将其更改回来,因此按照 Microsoft 团队的建议添加一个单独的命令似乎会让一切顺利。