10

.NETで最初のRESTAPIの開発を始めたところです。ステートレスになるため、認証にトークンを使用します。

基本的な考え方(System.Security.Cryptography):

  • 暗号化のためのAES+整合性のためのHMACSHA256
  • トークンデータは、ユーザー名、発行日、タイムアウトのプロパティを持つオブジェクトで構成されます
  • データベースは、ユーザー名、ハッシュ化されたパスワード、およびHMACハッシュを保持します

ログイン:

  • 資格情報が有効かどうかを確認します(ユーザー名、ハッシュされたパスワードをdb値と比較します)
  • trueの場合、データオブジェクトを暗号化します
  • 生成されたトークンでHMACを使用し、データベースに保存します
  • トークン(HMACなし)をユーザー(cookie / string)に返します

認証が必要なメソッドへのリクエスト:

  • ユーザーはリクエストごとにトークンを送信します
  • トークンは復号化されます
  • 有効期限が切れている場合、エラー
  • 有効期限が切れていない場合は、HMACを使用して、ユーザー名+生成されたハッシュをdb値と比較します
  • dbチェックが有効な場合、ユーザーは認証されます

私の見方では、このアプローチには次のような長所があります。

  • dbが危険にさらされている場合でも、実際のトークンは含まれていません(ハッシュを元に戻すことはできません...)
  • 攻撃者がトークンを持っていても、有効期限はトークン自体にあるため、フィールドを更新して有効期限を増やすことはできません。

さて、まず、これは良いアプローチかと思います。

それ以外に、AESキーとSHA256キーをサーバーのどこに保存するかがわかりませんでした(ハードコーディングするだけでいいですか?それらをweb.configに配置するか、マシンキーを使用すると、負荷分散サーバーの場合に問題が発生します。 ...)。

そして最後に、Crypto.CreateEncryptorは復号化のためにAES IVベクトルを必要とするので、どこにAES IVベクトルを保存しますか?ユーザーはリクエストごとにトークン+IVを送信する必要があるということですか?

これが理にかなっていることを願っています。事前に回答をありがとうございます。

アップデート:

さて、今私はさらにいくつかの調査を行い、この解決策を思いつきました:

  • トークンには、最初に指定されたデータ(ユーザー名、発行日、タイムアウト)が含まれます
  • トークンはencrypt-then-macで生成されます(HMACSHA265で生成された、AES暗号化データ、認証用のこれら2つの値のIVベクトル+タグが含まれます)
  • トークンタグはdbに書き込まれます
  • 次の場合、ユーザーは認証されます。
    • タグは有効です(トークン認証)
    • データを復号化できます
    • トークンはまだ有効期限が切れていません
    • タグはデータベースに書き込まれたものと一致します
    • ユーザーがデータベースでブロックされていない(必要に応じてトークンの無効化)
  • キーはweb.configの別のセクションに保存されます。同じキーがすべてのサーバーに存在する必要があります(もちろんアプリケーションごとに)

.NETには次の問題があるため、FormsAuthenticationTicketを使用しませんでした。

4

1 に答える 1

7

これは、質問の下のコメントスレッドからのフォローアップです。

OAuthが正確に何であるかについて少し混乱しているようですので、ここで明確にできれば幸いです。

OAuthは、Webサービスやユーザーが利用するものではありません。これは、サイトがユーザーの資格情報を認識できるようにすることなく、サイトがサービスに対してユーザーを認証する方法を説明するプロトコルです。副次的な利点として、ほとんどのOAuthプロバイダーにはユーザーの情報を照会するためのWebサービスもあり、同時にそうするための許可を与えることができます。

通常、ユーザーがFacebookやGoogleなどを介してログインできるように、サイト(AcmeWidgets.comなど)の観点からOAuthを実装することに関心があります。ただし、サービス側(たとえば、Facebookが通常ある場所)を実装して、他のユーザーがあなたに対して認証できるようにすることもできます。

たとえば、サードパーティのサイトがユーザーにAcmeブランドのウィジェットをプロビジョニングできるようにするWebサービスがあるとします。最初のサードパーティの実装者は、人気のあるMyBook.orgです。フローは次のようになります。

  1. 誰かが、MyBookプロファイルで「AcmeWidgets」アプリを使用するようにユーザーを招待します。
  2. ユーザーがボタンをクリックすると、AcmeWidgets.comにリダイレクトされます。URLは次のようになります。

    http://acmewidgets.com/oauth/user?r=http%3A%2F%2Fmybook.org%2Foauth%2Fclient&appid=12345

  3. ユーザーは、MyBookがデータにアクセスしてウィジェットをプロビジョニングできるようにするかどうかを尋ねられます。
  4. ユーザーが[はい]をクリックすると、AcmeWidgetsはユーザーがそれを許可したことを通知します。
  5. ユーザーは、次のようなURLでMyBookにリダイレクトされます。

    http://mybook.org/oauth/client?token=ABCDEFG

  6. サーバー側のMyBookは、そのトークンを受け取り、Webサービス呼び出しをAcmeWidgetsに戻します。

    http://acmewidgets.com/oauth/validate?token=ABCDEFG&appid=12345&appsecret=67890

  7. AcmeWidgetsは、ユーザーを識別する最終的な認証トークンで応答します。
  8. または、失敗します。これは、ユーザーがトークンを偽造しようとしているか、許可またはその他の失敗条件を拒否したことを意味します。
  9. MyBookは、トークンを使用して、AcmeWidgetsAPIを呼び出すことができるようになりました。

    http://acmewidgets.com/api/provision?appid=12345&token=ABC123&type=etc

これはすべてOAuthダンスとして知られています。ここには、URL、さまざまなトークンをエンコードする手段、トークンが期限切れになるか取り消されるかなど、実装で定義されたものがいくつかあることに注意してください。

うまくいけば、それはあなたのためにすべてをクリアします!

于 2013-03-18T18:49:21.973 に答える