ASP.NET WEB APIにおける認証と認可

3086 ワード

中国語と英語の用語対照

  • Authentication-認証は、ログインユーザーのアイデンティティを決定することです.
  • Authorization-ライセンスは、認証されたユーザーがどのような操作を実行できるかを決定することです.
  • Principal-エンティティは、コードが実行されるセキュリティコンテキストを表します.
  • HTTP Module-HTTPモジュール、IIS中のモジュール
  • HTTP Message Handler-HTTPメッセージプロセッサ
  • Identity-現在のユーザーのID
  • を含むユーザーを表すID.
  • Host-WEBサービスホスト、IISサーバであってもよく、自己管理のサービスプロセス
  • を可能にする.

    Authentication(ユーザー認証)


    ASP.NET WEB APIにおけるユーザ認証は、HTTPモジュールとHTTPメッセージプロセッサの2つの方法で実現することができる.

    1.HTTPモジュールによる認証


    プロジェクトでは、IISに組み込まれた任意の認証モジュール(匿名認証、Basic基本認証、Windows統合認証、Digest要約認証、Microsoft.NET Passport認証)を使用するように構成できます.
    ユーザを認証すると、コードによって実行されるセキュリティコンテキストを表すIPrincipalオブジェクトであるPrincipal(ボディ)が作成され、属性Threadを呼び出す.CurrentPrincipalの設定方法は、ユーザが既に認証に合格している場合、Identityを含む関連するIdentityオブジェクトを含むマスターを現在のスレッドに設定する.IsAuthenticatedプロパティはtrueであり、匿名リクエストの場合falseである.

    2.HTTPメッセージプロセッサによる認証


    ホストが提供するHTTPモジュール認証方法を使用しなければ、HTTP Message Handlerを実装することもできます.この場合、HTTPメッセージプロセッサは、HTTP要求をチェックし、Principalを設定する責任を負います.メッセージ・プロセッサを使用して認証を処理するのはいつですか?次の要素を考慮します.
  • HTTPモジュールはすべてASPを通過するまで監視できる.NETパイプの要求であり、HTTPメッセージプロセッサはWEB APIにルーティングされた要求しか監視できない.
  • 各ルーティングにメッセージプロセッサを設定し、異なるルーティングに対して異なる認証ポリシーを適用することができます.
  • HTTPモジュールはIISサーバに固有であり、HTTPメッセージプロセッサはホストに対して透明であるため、IISサーバ管理環境にも自己管理環境にも使用できる.
  • HTTPモジュールはIISのログ、監査などの機能を使用できますが、メッセージプロセッサは使用できません.
  • HTTPモジュールはASP.NETパイピングは事前に実行され、HTTPメッセージプロセッサが認証すると、HTTPメッセージプロセッサに実行される場合にのみPrincipalが設定され、応答メッセージがHTTPメッセージプロセッサから離れると、Principalはデフォルト値に戻されます.
  • 基本的には、サービス自己管理をサポートする必要がない場合は、HTTPモジュールがより良い選択です.自己管理をサポートする必要がある場合は、HTTPメッセージプロセッサの使用を考慮する必要があります.

    Authorization(ユーザー認証)


    ライセンスはASP.で発生する.NETはパイプの末端を処理し、コントローラに近い部分で、リソースアクセス権限を取得する際により細粒度の選択を行うことができます.
    認証フィルタ(Authorization filters)は、コントローラの動作の前に実行され、要求が認証されていない場合、フィルタはエラー応答を返し、コントローラの動作は呼び出されません.コントローラの動作内部では、属性Apiを通過することができる.Controller.Userは現在のボディを取得します.次のコードはSystemの使用方法を示す.Web.Http.AuthorizeAttributeプロパティを使用して、認可を指定します.
        //           
        [Authorize]
        public class ValuesController : ApiController
        {
            public HttpResponseMessage Get(int id) { ... }
            public HttpResponseMessage Post() { ... }
        }
    
        //          
        public class ValuesController : ApiController
        {
            public HttpResponseMessage Get() { ... }
        
            [Authorize]
            public HttpResponseMessage Post() { ... }
        }
    
        //           ,            
        [Authorize]
        public class ValuesController : ApiController
        {
            [AllowAnonymous]
            public HttpResponseMessage Get() { ... }
        
            public HttpResponseMessage Post() { ... }
        }
    
        //         
        [Authorize(Users="Alice,Bob")]
        public class ValuesController : ApiController
        {
        }
           
        //              
        [Authorize(Roles="Administrators")]
        public class ValuesController : ApiController
        {
        }
    
        //         
        public HttpResponseMessage Get()
        {
            if (User.IsInRole("Administrators"))
            {
                // ...
            }
        }