web-dev-qa-db-ja.com

ASP.NETクライアントWebアプリのアクセストークンと更新トークンを保存する場所-REST APIを呼び出す

レポートデータのSQL Serverデータベースへのエントリポイントとして機能するWeb APIをASP.NETで作成しました。このサービスには、ASP IDを介してユーザーを認証し、20分のアクセスと2週間の更新トークンを返す「トークン」エンドポイントがあります。

このAPIには、独自のアプリと製品を介してのみアクセスできます。 Androidアプリ、iOSアプリ、および上記のこのWeb APIからデータを取得して取得するASP.NET Webアプリケーションを作成します。私がASPを担当します。 NETクライアントウェブアプリケーションとAPI。これらのアプリはすべて、お客様がログインして使用できるように内部で構築されています。自社以外のサードパーティが独自のアプリからAPIを呼び出すことはありません。

私のクライアントのASP.NET Webアプリについては、ASP.NET MVCで記述しています。すべてのAPIと通信するため、現時点では実際にはデータベースがありません。

私はこれをベースとして始めましたが、うまくいきます...しかし、このHTMLファイルをMVCのASP.NET Webアプリに変換し、アクセストークンと更新トークンをどこにどのように保存するかを理解する必要があります。 http://blog.rfaisal.com/2014/01/14/building-your-own-api-and-securing-it-with-oauth-2-0-in-asp-net-webapi- 2 /

私の質問は:

  1. CRUD操作を行うには、APIへの後続の呼び出しでアクセストークンを渡す必要があることを理解しています。上記のチュートリアルのように、C#コードビハインドまたはJavaScriptからログインするときに、Webアプリでユーザーを認証するためのWebリクエストをどこに送信する必要がありますか?私のJS Ajax呼び出しでアクセストークンが必要であることを理解しているので尋ねますが、更新トークンはより「安全」である必要があり、サーバーコードからの呼び出しは私にそうすることのより安全なオプションを与えるかもしれませんか?

  2. アクセストークンはどこに保存しますか? JavaScriptまたはサーバーで作成されたCookieにありますか? JavaScriptローカルストレージで?私がJavaScriptに渡すことができるセッション変数では?

  3. 更新トークンはどこに保存しますか?有効期限が近づく前にアクセストークンを更新するには、これが必要です。私はこれを死ぬまでググったが、消費するWebアプリケーションの観点からこれをどこにどのように保存するかを教えてくれる優れたASP.NETソリューションをオンラインで見つけることができない。サーバーから作成され、Webアプリが使用するSQL DBに保存されたCookieをセッション変数に保存しますか?

私は必死に助けを必要としています、そしてこれは私を狂気にさせ、私を夜に目を覚まさせ続けます。誰かが完全で単純な例を提供し、私が何をする必要があるかを完全に説明できることを願っています。

19
Andy DesRosiers

1.ユーザーをどこで認証しますか?

認証が必要なユーザーの場合、フロントエンドに何かが必要です。フロントエンドから、POSTをユーザー資格情報を使用してバックエンドに対して実行することができます。ユーザー資格情報を確認し、資格情報がある場合はaccesstoken/refreshtokenペアを発行します既知です。ユーザーを認証するには、常にバックエンドを経由する必要があります。チュートリアルではJSを使用しているが、そうではないことを説明しました。ログインフォームに投稿します。POST =はJSで開始されますが、バックエンドに移動します。

2. accesstokenはどこに保存しますか?

Accesstokenは、通常の認証Cookieが格納されるのと同じ方法で格納できます。さまざまなオプションがあります(安全なhttpのみのcookie、localstorage、セッションストレージなど)。最も単純なシナリオでは、それをCookieに格納するだけで、各リクエストとともに送信されます。ただし、モバイルアプリの場合は、おそらくLocalStorageに保存する方が簡単です。

3.リフレッシュトークンはどこに保存しますか?

これはアプリケーションに大きく依存します。私 同じ質問をした 少し前に、モバイルアプリについて(コメントも必ず読んでください)。リフレッシュトークンは安全な場所に保管してください。開発するアプリについては、私がリンクした回答からの提案に従うことができます。

  • リフレッシュトークンをLocalStorageに保存します
  • Android/IOSが提供するAPIを使用して、暗号化された更新トークンをファイルシステムのどこかに保存します。暗号化キーをローカルストレージに保存します。 (またはその逆)。

他の種類のアプリについては、他の可能性が存在します。 localStorageにaccesstokenとrefreshtokenの両方を格納すると、セキュリティの観点からは問題があるように感じるかもしれませんが、攻撃者はおそらく、ローカルストレージへのアクセスを取得するよりも、トークンが転送中に傍受するほうが運が良いでしょう。その他、時にはよりエキゾチックな提案が示されます ここ (たとえば、IOS安全なストレージ)。

追加情報

  • 私は個人的に この一連のブログ投稿 がとても好きです。少し古くなっているかもしれませんが、REST-OWINのセットアップに関する豊富な情報が含まれていることに注意してください。
  • 他のすべてのセキュリティ制御を実装することを忘れないでください。これは答えを曇らせるので言及していません。 HTTPS、httpのみのCookie、安全なCookie、XSS防止などを実装する必要があります。そうしないと、この回答を読むのに必要な時間よりもはるかに早くトークンが盗まれます。
13
Michael