web-dev-qa-db-ja.com

Asp.Net Core Windows認証が機能しないIIS

Asp.Net Coreは、Windows認証が有効であり、IIS ExpressまたはIISで実行されている場合、_context?.User?.Identity?.Name_の呼び出しからユーザーを認識しないようです。

望ましい動作:IISおよび/またはIIS Express)でWindows認証と匿名認証の両方を有効にすると、Asp.Net CoreはWindowsユーザーを自動的に認識します。

実際の動作:IISまたはIIS Express)でウィンドウと匿名認証の両方を有効にすると、ユーザー名がnullになります。匿名認証を無効にするかHttpContext.ChallengeAsync(IISDefaults.AuthenticationScheme)、不要なログインプロンプトが表示されます。

私の理解では、これをActive Directoryに使用したい場合でも、Windowsユーザーを認証するためにActive Directoryやドメインは必要ありません。

環境:

  • Windows 8.1(ドメイン上ではない)
  • IIS 8.5/Visual Studio 2017 w/IIS Express
  • インストールされているWindows認証セキュリティ機能
  • Windows認証&(NTLMプロバイダーを使用)&匿名認証が有効
  • ローカルアカウントユーザーとしてログイン

依存関係:

  • Microsoft.AspNetCore.All 2.0.8

起動:

_public void ConfigureServices(IServiceCollection services)
{
    services.Configure<IISOptions>(iis =>
    {
        iis.AuthenticationDisplayName = "Windows";
        iis.AutomaticAuthentication = true;
    });

    services.AddAuthentication(IISDefaults.AuthenticationScheme);
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseAuthentication();
    app.Run(async (context) =>
    {
        await context.Response.WriteAsync(JsonConvert.SerializeObject(new
        {                
            UserName = context?.User?.Identity?.Name
        }));
    });       
_

launchSettings.json:

_{
  "iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:51682/",
      "sslPort": 0      
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}
_

web.config:

_<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <remove name="aspNetCore" />
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore forwardWindowsAuthToken="true" processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" />
  </system.webServer>
</configuration>
_

applicationhost.config:(IIS Express)

この記事に基づく: https://docs.Microsoft.com/en-us/iis/configuration/system.webServer/security/authentication/windowsAuthentication/

_<authentication>
  <anonymousAuthentication enabled="true" userName="" />
  <basicAuthentication enabled="false" />
  <clientCertificateMappingAuthentication enabled="false" />
  <digestAuthentication enabled="false" />
  <iisClientCertificateMappingAuthentication enabled="false"></iisClientCertificateMappingAuthentication>
  <windowsAuthentication enabled="true">
    <providers>
      <add value="NTLM" />
    </providers>
  </windowsAuthentication>
</authentication>
_
8
szahn

いくつかのこと:

  1. 匿名認証を無効にすると、ブラウザがサイトを信頼していない可能性が高いため、ポップアップが表示されます。 (Windowsコントロールパネルから)[インターネットオプション]を開く必要があります-> [セキュリティ]タブ-> [信頼済みサイト]をクリックし、[サイト]をクリックして、サイトのURLを追加します。 IEとChromeの両方を使用して、認証情報を自動的に送信するかどうかを決定します。

  2. 匿名の両方が有効でWindows認証が有効になっている場合、ユーザーがログインする必要があることを伝える場所を除いて、匿名が優先されます。これを行うには、使用 [Authorize]属性は、コントローラー、または個別のアクションのみのいずれかです。

詳細は、ここの「匿名アクセスを許可する」の下にあります: https://docs.Microsoft.com/en-us/aspnet/core/security/authentication/windowsauth?view=aspnetcore-2.0&tabs=aspnetcore2x# allow-anonymous-access

3
Gabriel Luci