從 ASP.NET 5 轉進 ASP.NET Core,有些地方需要重蹲馬步打基礎。

拿最近遇到的切換匿名存取或 Windows 驗證為例。ASP.NET + IIS 的話是從 IIS 管理員或由 web.config 設定;IIS Express 則可用 Visual Studio 專案屬性視窗切換,熟到像是反射動作。但,ASP.NET Core 呢?登楞!

在 Visual Studio 新增 ASP.NET Core 專案時可選取 Authentication 方式,有 Windows 驗證或匿名可選:

若專案原本為匿名存取想改成 Windows 驗證,或是想從 Windows 驗證改回匿名存取,開關藏在專案 Properties 目錄下的 launchSettings.json,透過 iisSettings/windowsAuthentication 及 anonymousAuthentication 設定 true/false 可切換 IIS Express 是否啟用匿名或 Windows 驗證,相當以前 ASP.NET 專案屬性視窗裡的設定,有 ASP.NET 開發經驗的同學應該不難理解。

{
  "iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": false,
    "iisExpress": {
      "applicationUrl": "http://localhost:65405",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "AspNetCoreWeb": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

ASP.NET Core 部署到 IIS 後,則改由 web.config 控制,透過 IIS 管理員調整或修改 <system.webServer><security><authentication> 皆可,跟 ASP.NET 時代做法雷同。

上述做法適用於 IIS/IIS Express,在 Kestrel 要啟用 Windows 驗證稍稍複雜一點。

等等! Kestrel 不是用在 Linux 等非 Windows 環境,幹嘛整合 Windows 驗證?其實 Linux、macOS 是可以支援 AD 驗證的 參考,雖然不常見,但在 Linux 跑 Kestrel 讓使用者用 AD 帳號登入 ASP.NET Core 網站,真的是一種選項。

要在 Kestrel 使用 Windows 驗證,專案需參照 Microsoft.AspNetCore.Authentication.Negotiate NuGet package,並修改 Startup.cs 加入 services.AddAuthentication(...) 及 app.UseAuthentication():

public void ConfigureServices(IServiceCollection services)
{
    //設定支援 Negotiate, Kerberos 及 NTLM 驗證
    services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
        .AddNegotiate();
    services.AddRazorPages();
}
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();
    });
}

IIS/IIS Express 關閉匿名存取的話就會強迫使用者一律登入,Kestrel 不同,必須在 Controller 或 Razor Page Model 加上 [Authorize] 才能要求使用者登入存取。除了逐一設定,亦可在 AddMvc() 時預設加入 AuthorizeFilter 全面啟動:參考:Apply Authorization by default in ASP.NET Core

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(o =>
    {
        var policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
        o.Filters.Add(new AuthorizeFilter(policy));
    });
}

嗯,ASP.NET Core Windows 驗證的技巧切換,GET!

【延伸閱讀】

Microsoft Docs: Configure Windows Authentication in ASP.NET Core

Tips of how to eanble Windows authentication in ASP.NET Core project.


Comments

Be the first to post a comment

Post a comment