繁体   English   中英

如何在启用Windows身份验证的情况下以编程方式启动和停止ASP.NET Core 2.1应用程序?

[英]How to start and stop an ASP.NET Core 2.1 app programmatically with Windows Authentication enabled?

我对ASP.NET Core 2.1应用程序有一组非常具体的需求,我似乎无法解决这个问题。 该应用程序的目的是演示如何使用自动化工具(如Selenium)使用Web代理,特别是针对使用NTLM身份验证的站点。

因为这是一个在其他正在运行的代码的上下文中使用的演示站点,所以我需要能够以编程方式启动和停止它。 我似乎无法找到任何方法来有效地使用Kestral和IIS / IIS Express来适当地启动和停止应用程序。

因为我想证明使用配置了代理的Web浏览器来浏览并通过此站点进行身份验证,并且因为大多数浏览器在浏览localhost站点(及其堂兄弟127.0.0.1::1 )时绕过代理,我需要能够使用localhost以外的主机名来浏览站点,并且我在hosts文件中使用了一个简单的别名来实现此目的。 但是,这会让HTTP.sys正确,因为尝试注册除localhost结果之外的任何URL前缀,完全不出所料地知道HTTP.sys如何工作,在Access denied错误中。

我已经检查 其他 几个 答案 ,所有这些答案似乎已经过时,或者只是不适合我。

启动类如下:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<IISOptions>(iis => { iis.AutomaticAuthentication = false; });
        services.AddAuthentication(IISDefaults.AuthenticationScheme);
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseMvc();
    }
}

如果我使用“IIS Express”配置文件在调试器中手动启动应用程序,它的工作原理是我收到提示输入凭据。 如果我使用“项目”配置文件,当然,它不起作用,因为Kestrel似乎不理解没有HTTP.sys的Windows身份验证。 如果我尝试使用任何编程方式来启动应用程序( WebHost.CreateDefaultBuilder().Build().StartAsync ),它无法提示进行身份验证,我猜测它的原因与它不起作用相同调试器中的“项目”配置文件。

关键是要在克隆演示存储库后避免用户进行最少的配置。 在完整的IIS中托管Web应用程序是一个非首发。 同样,需要管理员访问权限的解决方案(如使用netsh http add urlacl )或以管理员netsh http add urlacl运行也是非启动者,因为许多用户没有对其计算机的管理访问权限。

我正在尝试甚至可能吗? 我怎样才能将它拼凑起来以使其有效? “你想做的事情是不可能的”,这是一个非常有效的答案,但如果这是给出的答案,我想了解为什么这是不可能的更多信息。

我没有太多的IIS经验,也没有完全理解你的情况,但我希望我可以分享足够的帮助你解决这个问题。

您的问题似乎有三个方面:

  1. 不使用localhost作为主机名。
  2. Windows身份验证
  3. 以编程方式启动和停止应用程序。

我无法帮助1.关于Windows身份验证:

  1. ASP.NET Core支持两种带有IIS的托管模型: InProcessOutOfProcess
  2. 当您选择“IIS Express”时,IIS会为您运行ASP.NET核心应用程序( InProcess ) - 因此图中没有红隼。 当您选择项目配置文件时,您实际上是使用Kestrel( OutOfProcess )自托管应用程序 - 因此除非您明确将其配置为充当反向代理,否则图片中没有IIS。
  3. 只要您使用InProcessOutOfProcess获得图片中的IIS,您就应该能够使用Windows身份验证。
  4. Kestrel对Windows身份验证的支持取决于HTTP.sys。
  5. 推荐阅读: 在ASP.NET Core中配置Windows身份验证 使用IIS在Windows上托管ASP.NET Core

关于启动和停止应用程序:

  1. 使用OutOfProcess ,您可以完全控制,您可以随意启动和停止,因为您可以访问WebHost对象。
  2. 使用InProcess ,我不确定使用WebHost启动/停止是否可行,但您可以使用IApplicationLifetime.StopApplication()停止它,并让IIS在下一个请求时为您启动它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM