これは素晴らしい質問ですが、あなたの解決策は、あなたが考えているよりも少し複雑である必要があると思います.
一般に、この種のシナリオを認証する方法は、2 段階のハンドシェイクです。最初のステップは、アプリケーションが実際に有効なクライアントであることを認証するために、(サーバーによって生成された、クライアント アプリケーションに固有の) 秘密鍵をサーバーに提供することです。これは、サーバーが認識し、信頼できるソフトウェアからの要求であるという信頼できる証拠をサーバーに提供するものです。
2 番目のステップは、ユーザーがクライアント アプリケーションにログインするときに、ユーザー名とパスワードの組み合わせを提供することです。この情報は、アプリケーション キーとともに、すべて SSL 経由でサーバーに送信する必要があります。
SSL はデータを暗号化して、パケット スニファーを使用するサードパーティが転送中のデータを読み取ることができないようにします。サーバーは次のことを行います。
- アプリケーション キーが有効であることを確認します。
- ユーザー名が存在し、アプリケーションに関連付けられていることを検証します。
- パスワードを暗号化し、ユーザー名に関連付けられたデータベース内の暗号化されたバージョンに対して暗号化されたバージョンをテストします。
- 上記のすべてのチェックに合格すると、サーバーはセッション ID を返します。この ID は、クライアント側の Cookie に入れることができ、後続の各要求でユーザーを再認証するために使用されます。いずれかのテストが失敗した場合 - サーバーは
401: Unauthorized
応答または他の同様のエラーを返します。
この時点で、クライアントは返されたセッション ID を利用でき、アプリケーション キーの再送信を続行する必要はありません。
あなたの申請
さて、あなたの場合、実際には同じアプリケーションと同じサーバーでクライアント/サーバーをホストしている可能性があります。この場合、一般に、アプリケーションのプライベート キーを中心に展開するすべての部分をスキップして、代わりにクロスサイト スクリプト リクエストを単純に禁止することができます。
なんで?- あなたが本当に保護しているのは次のようなものだからです:
サーバー A は RESTful API をホストします。クライアントの B、C、および D のホスト クライアントは、サーバー A の API に依存します。望ましくないのは、クライアント E (アプリケーションではなく、悪意のある) が、他のクライアントのいずれかの資格情報をバイパスまたは盗むことによって、サーバー A にアクセスできることです。
ただし、クライアントとサーバーの両方が同じ場所でホストされているため、同じ URL を持っている場合 (つまり、RESTful API が存在しwww.yourdomain.com/api
、クライアントが存在するwww.yourdomain.com/
場合)、通常、外部から発信された AJAX タイプのリクエストを許可することはできませんyourdomain.com
。それがセキュリティのレイヤーです。
この場合、適切なレベルのセキュリティを確保するために必要なことは次のとおりです。
- サーバーの SSL を有効にします。
- へのリクエスト
/auth/login
(またはログインPOST
方法が何であれ) のみを SSL 経由で受信できるようにします (C#[RequireHttps]
では、メソッドまたはコントローラーの属性を使用してこれを行うことができます)。
- 独自のドメイン外から発信された AJAX リクエストを拒否します。
- Cookie で暗号化レイヤーを使用します。
クッキーには何を含める必要がありますか?
理想的には、Cookie には、サーバーのみが復号化できる双方向暗号化データが含まれている必要があります。言い換えれば、ユーザーのusername
またはuser_id
Cookieの中に何かを入れることができますが、Rijndaelまたは別の暗号化システムを使用して双方向暗号化します-サーバーのみがアクセスできる暗号化パスワードを使用します(ランダムな文字列をお勧めします)。
次に、Cookie が添付された後続のリクエストを受信すると、次の操作を簡単に実行できます。
- Cookie が存在する場合は、プライベート パスワードを使用して復号化を試みます。
- 結果の復号化されたデータがガベージである場合 - 応答をスローします
401: Unauthorized
(これは変更された、または偽の Cookie です)
- 結果の復号化されたデータがデータベースと一致するユーザー名である場合 - 誰がリクエストを行っているかがわかり、それに応じてデータをフィルタリング/提供できます。
これが役立つことを願っています。:) そうでない場合は、お気軽にコメントを投稿して質問してください。明確にするよう努めます。