在 NET 5 asp.net 核心 Web 应用程序中为 Kestrel 启用 Windows 身份验证

Posted

技术标签:

【中文标题】在 NET 5 asp.net 核心 Web 应用程序中为 Kestrel 启用 Windows 身份验证【英文标题】:Enable windows auth for Kestrel on NET5 asp.net core webapp 【发布时间】:2021-10-15 04:27:48 【问题描述】:

我在 Visual Studio 2019 中从模板 ASP.NET Core Web 应用程序(目标框架:.NET 5.0(当前))创建了测试应用程序。

现在我想设置这个应用程序以使用 Windows 身份验证,如下所述:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/windowsauth?view=aspnetcore-5.0&tabs=visual-studio#kestrel

我已经安装了 nuget 包 我在 Startup.ConfigureServices 中添加了services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate(); 我在UseAuthorization 之前添加了app.UseAuthentication();,如ASP.NET Core Middleware 中所述

我还更正了 index.cshtml 以指示登录的用户名:

    <h1 class="display-4">Welcome, @HttpContext.User.Identity?.Name</h1>

但是当我将此站点发布到文件夹(目标运行时:便携式)并复制到安装了 NET5 的远程 Windows 服务器(域中的服务器,当然是 Windows Server 2012)时 - 我在浏览网站时看不到用户名。 (我从命令行运行 WebApplication2.exe)

我的情况出了什么问题,或者我应该检查什么来解决这个问题?

PS 我的 Startup.cs:

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.AddRazorPages();

        services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
                .AddNegotiate();
    

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    
        if (env.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
        
        else
        
            app.UseExceptionHandler("/Error");
        

        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        
            endpoints.MapRazorPages();
        );
    

这适用于我自己的工作站,它也是同一域的一部分。即使没有安装这个 nuget 包(在 IIS 模式下),它也会显示我的用户名。

我不仅检查了 chrome,还检查了 IE 和 Firefox - 结果相同。

我已经检查过该协议不是 HTTP/2:


当我将此字符串添加到我的 appsettings.json 时:

  "Microsoft.AspNetCore.Authentication": "Debug"

然后我可以在控制台日志中看到这条消息:

dbug: Microsoft.AspNetCore.Authentication.Negotiate.NegotiateHandler[9]
      AuthenticationScheme: Negotiate was not authenticated.

【问题讨论】:

【参考方案1】:

aspnetcore sources on github 中有一个working example。它也适用于我的服务器。

所以,在逐行比较两个解决方案后,我发现了不同之处。

除了官方文档告诉您需要在 Startup.cs 中添加这一行:

        services.AddAuthorization(options =>
        
            options.FallbackPolicy = options.DefaultPolicy;
        );

您需要指定 DefaultPolicy,因为它包含 .RequireAuthenticatedUser() 调用:

public AuthorizationPolicy DefaultPolicy  get; set;  = new AuthorizationPolicyBuilder(Array.Empty<string>()).RequireAuthenticatedUser().Build();

如果你只添加 services.AddAuthorization(); 这将不起作用。

【讨论】:

以上是关于在 NET 5 asp.net 核心 Web 应用程序中为 Kestrel 启用 Windows 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

JWT 和 asp.net(核心)Web 应用程序

通过 Internet 公开我的 asp.net 核心 Web 应用程序

如何在使用 JWT 的 asp.net 核心 web 应用和 web api 中使用谷歌身份验证

ValidateAntiForgeryToken 端点属性在 Asp.Net 核心 Angular Web 应用程序中每次 CSRF 攻击的使用情况

text 使用ASP.NET Core 2 Web API,Angular 5,.NET核心身份和Facebook登录进行JWT身份验证

Web APi Vs MVC 和在 ASP.net 核心 Web APi 中提供静态文件