nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Development Technologies。

【連載】ASP.NET Web API を使おう:第5回 統合 Windows 認証を利用する

本エントリーは連載「ASP.NET Web APIを使おう」の第3回となります。連載の目次はこちら。

www.nuits.jp

さて今回は、Web API の利用にあたり統合 Windows 認証を適用する方法を説明します。

1. 前提条件

本連載で作成してきたコードが存在する前提で説明を進めますが、なくても理解できるよう記載しています。

また以下の環境の元記載しています。

  • Visual Studio 2017 Version 15.5.6
  • .NET Framework 4.7.1

2. サーバーサイドに適用する

まずは HelloWebApi プロジェクトの Web.config ファイルを開いてください。

f:id:nuitsjp:20180215114104p:plain

Web.config の先頭につぎのような記述があります。

<?xml version="1.0" encoding="utf-8"?>
<!--
  ASP.NET アプリケーションの構成方法の詳細については、
  https://go.microsoft.com/fwlink/?LinkId=301879 を参照してください
  -->
<configuration>
  <appSettings></appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.7.1" />
    <httpRuntime targetFramework="4.7.1" />
  </system.web>

これを、つぎのように system.web の下に統合 Windows 認証を有効にするよう設定変更します。

<?xml version="1.0" encoding="utf-8"?>
<!--
  ASP.NET アプリケーションの構成方法の詳細については、
  https://go.microsoft.com/fwlink/?LinkId=301879 を参照してください
  -->
<configuration>
  <appSettings></appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.7.1" />
    <httpRuntime targetFramework="4.7.1" />
    <authentication mode="Windows"/> <!-- 統合Windows認証の有効化 -->
  </system.web>

つづけて、Visual Studio でデバッグする際に利用される IIS Express で、統合 Windows 認証を有効化し、匿名認証を無効化します。

HelloWebApi プロジェクトのプロパティを開き、設定を変更してください。

f:id:nuitsjp:20180215114938p:plain

これで匿名でのアクセスは禁止されました。実際に動かしてみると、クライアントコード側で例外が発生するのがみて取れます。

f:id:nuitsjp:20180215115924p:plain

3. クライアントサイドに適用する

つづいて、クライアント側のコードを修正します。 HelloWebApi.Client プロジェクトの Program.cs を開いてください。現在は、つぎのように記述されているはずです。

var employeeApi = new EmployeesApi("http://localhost:9000");

foreach (var employee in employeeApi.EmployeesGet())
{
    Console.WriteLine($"Id:{employee.Id} Name:{employee.Name} BirthDay:{employee.BirthDay}");
}

このコードを、つぎのように修正しNTLM認証を有効化します。

var employeeApi = new EmployeesApi("http://localhost:9000");
employeeApi.Configuration.ApiClient.RestClient.Authenticator = new NtlmAuthenticator();

foreach (var employee in employeeApi.EmployeesGet())
{
    Console.WriteLine($"Id:{employee.Id} Name:{employee.Name} BirthDay:{employee.BirthDay}");
}

これで実装は完了です。

4. 認証状態を確認する

さて実際に動かす前に、EmployeesControllerにつぎのように認証情報を取得するコードを埋め込み、トレースにて認証情報を確認してみます。

public IEnumerable<Employee> Get()
{
    var isAuthenticated = User.Identity.IsAuthenticated;
    var user = User.Identity.Name;
    return _employeeRepository.GetEmoloyees();
}

デバッグ実行した結果が、つぎの通りです。認証情報が取得されていることが確認できます。

f:id:nuitsjp:20180215130722p:plain

以上です。

次回はCatsle.CoreのDynamicProxyを適用してAspect Oriented Programing(AOP)する方法を解説します。

www.nuits.jp