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

本文关键字:beta NET 支持 中的 Windows 身份验证 ASP | 更新日期: 2023-09-27 18:18:11

我有一个ASP。NET 5 MVC 6 Web API项目。大多数API端点都有[authorization]属性,并且Windows身份验证在IIS和Visual Studio项目的属性中都是启用的。

然而,在beta 8中,这不起作用。很容易用一个完全干净的项目复制这个:
  1. 使用asp.net创建一个新项目。. NET 5 Web API模板。
  2. 获取项目属性(不是解决方案),转到Debug选项卡,启用Windows身份验证并禁用匿名。保存更改
  3. 按F5,让它尝试运行项目。
结果:

试图确定承载应用程序的DNX进程的进程id时发生错误。

  • 现在回到项目属性并启用匿名。同时让Windows保持启用状态。保存更改
  • 进入你的控制器并添加[authorization]属性。
  • F5。
  • 结果:

    这次项目启动了,但是web API返回了一个500。注意在输出窗口:

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

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

    正如beta 8公告中所指出的,托管模型已经改变,IIS现在将请求传递给Kestrel。服务器页面没有任何迹象表明Kestrel支持Windows身份验证。是否有一些技巧可以让Windows身份验证在beta 8中工作?

    ASP中的Windows身份验证支持.NET 5 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<WebListener>();
    if (listener != null)
    {
        listener.AuthenticationManager.AuthenticationSchemes = 
            AuthenticationSchemes.NTLM;
    }
    

    然后在项目中。Json添加weblistener CMD,如下所示:

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

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

    我发现如果我在项目中直接改变"web"命令。Visual Studio将其修改得相当积极,所以按照微软团队的建议添加一个单独的命令似乎可以让一切都很顺利。

    有一个已知的工具错误会阻止您禁用"匿名身份验证":https://github.com/aspnet/Hosting/issues/419.

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

    确保您在Configure方法的早期也添加了app.UseIISPlatformHandler();:它需要解析对应于IIS的令牌流的Windows身份

    也在web中。你应该设置forwardWindowsAuthToken="true"例句:

     <httpPlatform processPath="%DNX_PATH%" arguments="%DNX_ARGS%" forwardWindowsAuthToken="true" startupTimeLimit="3600" />