0

Active Directory でアカウントを認証する Http.Sys を使用して、Net Core 3 API を Windows サービス (つまり、IIS を使用しない) として実行しようとしています。基本認証を有効にしたい (開発者が基本認証を要求した .NET 以外の言語をサポートする必要がある) が、利用可能な場合は Windows/Kerberos を許可します。

私はほとんどそこにいます。実際、私は基本的に私が望むすべてを行うサービスを持っています.1つのことを除いて-ケルベロスの代わりにNTLMが使用されているだけです。そのまま本番環境に移行できる可能性がありますが、kerberos を機能させられない理由を理解したいと思います。最後のピースは SPN だと思います。

作成:

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        return Host.CreateDefaultBuilder(args)
                   .ConfigureServices((hostContext, services) =>
                   {
                       services.AddAuthentication(HttpSysDefaults.AuthenticationScheme);
                       services.AddHostedService<Worker>();
                   })
                   .ConfigureWebHostDefaults(webBuilder =>
                   {
                       webBuilder.UseHttpSys(options =>
                       {
                           options.Authentication.Schemes = AuthenticationSchemes.Basic | AuthenticationSchemes.Negotiate;
                           options.Authentication.AllowAnonymous = true;
                           options.UrlPrefixes.Add("https://*:20010/");
                       });
                       webBuilder.UseStartup<Startup>();
                   })
                   .UseWindowsService();
    }

スタートアップ クラス:

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

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers().AddJsonOptions(opts =>
        {
            opts.JsonSerializerOptions.IgnoreNullValues = true;
            opts.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
        });
    }

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

        app.UseRouting();

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

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

コントローラ:

[ApiController]
[Route("test")]
[Authorize]
public class TestController : ControllerBase
{
    [HttpGet("run")]
    public ContentResult Run()
    {
        return new ContentResult
        {
            Content = $"Run Requested: {string.Join(",", this.User?.Identity?.Name, this.User?.Identity?.IsAuthenticated, this.User?.Identity?.AuthenticationType)}",
        };
    }
}

ps1スクリプトでnetshを使用してポート20010にセットアップした適切な証明書の代金を支払いました。

 $guid = [guid]::NewGuid()
 $certHash = "<CORRECT THUMBNAIL>"
 $ip = "0.0.0.0" # This means all IP addresses
 $port = "20010" # the default HTTPS port
 "http add sslcert ipport=$($ip):$port certhash=$certHash appid={$guid}" | netsh

ウェブサーバー:

  • ドメインに正しく参加している
  • netbios 名: mywebserver
  • フルネーム: mywebserver.ad.mydomain.com

サービス:

  • .net コア 3.1
  • ドメイン アカウント「myserviceaccount」で実行

現在、サービス アカウント 'myserviceaccount' には Web サーバーの管理者特権があります。このアカウントに証明書へのアクセス許可を直接付与すれば、それを削除できると思います。それとも、これをすべて機能させるには、システム アカウントとして実行する必要がありますか? ただし、これを行わないことをお勧めします。

アクティブ ディレクトリ:

  • ad.mydomain.com
  • サーバーの netbios 名: domainserver
  • サーバーのフルネーム: domainserver.ad.mydomain.com

そのままで、これはすべてのブラウザー/OS で、サービスを使用するように設定されているすべての言語で正常に機能します。正しくチャレンジし、ドメイン ユーザーに許可し、適切な証明書を表示します。しかし、上記のように、さまざまな認証テスター/フィドラーなどを使用すると、Windows クライアントからアクセスするときに NTLM のみが表示されます。

Web サーバーに次の SPN を設定しようとしました。

setspn -S HTTP/mywebserver.ad.mydomain.com:20010 MYDOMAIN\mywebserver

setspn -S HTTPS/mywebserver.ad.mydomain.com:20010 MYDOMAIN\mywebserver

setspn -S HTTP/mywebserver.ad.mydomain.com:20010 MYDOMAIN\myserviceaccount

setspn -S HTTPS/mywebserver.ad.mydomain.com:20010 MYDOMAIN\myserviceaccount

新しい SPN を試すたびにサービスを再起動し、すべてのブラウザーを完全に終了するようにしました。

これらが正しいかどうかはわかりません (NTLM にフォールバックするため、正しくないと思います!)。これらを mywebserver または domainserver で設定する必要があるかどうかはわかりません。

テストとしてのみスキームを AuthenticationSchemes.Kerberos に設定しようとしましたが、これを行うと、サーバーからまったく応答がありません。

誰かが私が一線を越えるのを手伝ってくれますか? 前もって感謝します!

4

0 に答える 0