RESTful Web サービスを認証する

HTTP では、リソースへのアクセスを制御するために、いくつかの認証メカニズムの使用がサポートされています。 基本認証では、適切な資格情報を持つクライアントにのみ、リソースへのアクセスが提供されます。 この記事では、基本認証を使用して RESTful Web サービス リソースへのアクセスを保護する方法について説明します。

Note

iOS 9 以上では、アプリ トランスポート セキュリティ (ATS) により、インターネット リソース (アプリのバックエンド サーバーなど) とアプリの間にセキュリティで保護された接続が適用されるため、機密情報の漏洩が防止されます。 iOS 9 用に構築されたアプリ内では ATS が既定で有効なため、すべての接続が ATS セキュリティ要件の対象となります。 接続がこれらの要件を満たさない場合は、例外を伴って失敗します。 HTTPS プロトコルを使用してインターネット リソースの通信をセキュリティで保護できない場合は、ATS をオプトアウトできます。 これは、アプリの Info.plist ファイルを更新することで実現できます。 詳しくは、アプリ トランスポート セキュリティを参照してください。

HTTP 経由でのユーザーの認証

基本認証は、HTTP でサポートされる最も単純な認証メカニズムであり、クライアントは暗号化されていない base64 エンコード テキストとしてユーザー名とパスワードを送信する必要があります。 手順は次のようになります。

  • Web サービスが、保護されたリソースへの要求を受信した場合、HTTP 状態コード 401 (アクセス拒否) でその要求を拒否し、次のダイアグラム内に示すように WWW-Authenticate 応答ヘッダーを設定します。

Basic Authentication Failing

  • Web サービスが、保護されたリソースへの要求を受信し、Authorization ヘッダーが適切に設定されている場合、Web サービスは HTTP 状態コード 200 で応答します。これは要求が成功し、要求された情報が応答の中にあることを示します。 このシナリオを次のダイアグラムの中に示します。

Basic Authentication Succeeding

Note

基本認証は、HTTPS 接続経由でのみ使用する必要があります。 HTTP 接続経由で使用すると、その HTTP トラフィックを攻撃者がキャプチャした場合に、Authorization ヘッダーを簡単にデコードできます。

Web 要求での基本認証の指定

基本認証の使用は次のように指定されます。

  1. 文字列 "Basic" が要求の Authorization ヘッダーに追加されます。
  2. ユーザー名とパスワードは、"username:password" という形式の文字列に結合され、base64 でエンコードされて要求の Authorization ヘッダーに追加されます。

したがって、ユーザー名に 'XamarinUser'、パスワードに 'XamarinPassword' を使用すると、そのヘッダーは次のようになります。

Authorization: Basic WGFtYXJpblVzZXI6WGFtYXJpblBhc3N3b3Jk

HttpClient クラスは、HttpClient.DefaultRequestHeaders.Authorization プロパティ上に Authorization ヘッダー値を設定できます。 HttpClient インスタンスは複数の要求にまたがって存在するため、Authorization ヘッダーは (次のコード例の中で示すように) 要求を行うたびにではなく、1 度だけ設定する必要があります。

public class RestService : IRestService
{
  HttpClient _client;
  ...

  public RestService ()
  {
    var authData = string.Format ("{0}:{1}", Constants.Username, Constants.Password);
    var authHeaderValue = Convert.ToBase64String (Encoding.UTF8.GetBytes (authData));

    _client = new HttpClient ();
    _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue ("Basic", authHeaderValue);
  }
  ...
}

それから、Web サービス操作に対して要求が行われると、その要求は Authorization ヘッダーで署名され、ユーザーにその操作を呼び出すアクセス許可があるかどうかを示します。

重要

このコードは資格情報を定数として格納しますが、発行されたアプリケーションでは、安全でない形式で格納するべきではありません。

Authorization ヘッダー サーバー側の処理

REST サービスは、各アクションを [BasicAuthentication] 属性で修飾する必要があります。 この属性は Authorization ヘッダーを解析し、base64 でエンコードされた資格情報が有効かどうかを (Web.config 内に格納されている値と比較することで) 判断するために使用されます。このアプローチはサンプルのサービスには適していますが、一般向けの Web サービス用には手を加える必要があります。

IIS で使用される基本認証モジュール内では、ユーザーは自分の Windows 資格情報に対して認証されます。 そのため、ユーザーはそのサーバーのドメイン上にアカウントを持つ必要があります。 ただし、基本認証モデルでは、データベースなどの外部ソースに対してユーザー アカウントを認証するカスタム認証を許可するように構成できます。 詳しくは、 ASP.NET Web サイト上の「ASP.NET Web API での基本認証」を参照してください。

Note

基本認証は、ログアウトを管理するようには設計されていません。したがって、ログアウトするための標準的な基本認証でのアプローチは、セッションを終了することです。