c# - クライアントとWeb API間のプロキシとしてMVCコントローラーを使用する

原文 c# asp.net asp.net-mvc rest asp.net-web-api

単一ページのアプリケーションを開発しようとしています。

ASP.NET Web APIを使用してRESTful Webサービスを構築しました。 OAuth 2.0Bearer access tokensを使用して認証を実装しました。

このWebサービスは、リソースと応答のキャッシュにmemcachedとHTTPキャッシュヘッダー(Cache-ControlETag)を使用します。

今、私はASP.NET MVCテクノロジが本当に好きで、多分その愛により、使用できないときにそれを使用するようになっているのかもしれません。

JavaScriptアプリケーションとWebサービスの間にMVC中間サーバーを構築することを考えています。

MVCサイトは、その要求をWebサービスにリダイレクト(または委任)します。

このアプローチを使用すると、多くの利点が得られます。


(認証に使用される)コンシューマキーを、JavaScriptアプリケーションに直接保存するのではなく、安全な場所に保存できます。
JavaScriptアプリケーションにCookieを提供できますが、これはREST Webサービスでサポートされていないものです(「ステートレス」および「Pure HTTP」の概念全体を台無しにしているためです。
私の見解にグローバリゼーション(ローカリゼーション)を提供するのは非常に簡単です。私はASP.NET MVCグローバリゼーションフレームワークが本当に好きです。スタンドアロンサイトを作成する場合は、この機能を追加する方法がわかりません。
アクセストークンのCookieを暗号化し、サーバーで復号化して、ユーザーが自分のアクセストークンを知らないため、MVCプロキシを使用してWebサービスにアクセスするように強制することができます。


これらの利点を述べたところで、これを実装する価値はありますか?

プロキシサーバーを追加すると、HTTPキャッシュロジックが複製され、最終的に1(クライアント-> Web API)ではなく2つのリクエスト(クライアント-> MVC-> Web API)が作成されます。

最善のアプローチは何ですか?
答え
優れたRESTful Webサービスを構築したようですが、認証とグローバリゼーションに対処する必要があります。

Auth

Web APIでこの種のプロキシまたはサポートCookie認証を使用すると、CSRF攻撃に対して脆弱になるため、Synchronizer Token Patternまたはsome other techniqueを実装してこれを防ぐ必要があります。ただし、この方法は、他に選択肢がない場合にのみ使用してください。

JavaScriptアプリケーションでユーザーが資格情報を入力する必要があると仮定すると、それに対する認証を処理する方法はいくつかあります。


OAuth2 Resource Owner Password Credentials Grant
JSON Web Tokens-付随するwebsiteおよびspecificationを参照


どちらの方法でも、保護されたAPIを呼び出すたびに渡す暗号化されたトークンがJSアプリに提供されます。アプリケーションでは、このトークンをローカルストレージに保持し、トークンの有効期限が切れたときに更新する必要があります。

グローバリゼーション

ほとんどのものをMVC側に置いても、最終的には翻訳されたコンテンツを配信するためにWeb APIが必要になります。したがって、ここでの要件が何かはわかりませんが、一般的に言えば、Web APIで翻訳されたリソースを同じ方法で取得できるはずです。たとえば、hereを参照してください。
HTML部分については、ASP.NET MVCに任せてください。すべてのラベル変換をAPIに入れる必要はありません。

考慮すべき他のポイント


パフォーマンス-ASP.NET MVCは優れていますが、プロキシソリューションではなく、そのようなものを構築することを単に意図していません
本当にHTTP APIが必要ですか?
HTTP経由でデータを転送することもオーバーヘッドのもう1つのポイントであることを忘れないでください。また、MVCを使用してプロキシすると、特に役に立たなくなります。
結局のところ、自分のアプリケーションからAPIを非表示にしているのに、なぜAPIを作成するのでしょうか。


私の答えは、非表示にしないでください-十分に活用してください!
関連記事

c# - C#キーを押すとオブジェクトの動きが壊れる

c# - ファイルが存在してもWebブラウザーのナビゲーションがキャンセルされました

c# - ユーザーのADからのオブジェクトGUID

c# - サービス時間を垣間見る方法

c# - log4net翌日の開始時にログファイルを上書きする

c# - ASP.NET MVC(部分的なビュー)を使用して同じページにレビュー製品(http投稿)を追加しようとしています

c# - Model3DCollectionとModel3DGroupの違いは何ですか?

java - 相互互換性のためにC#暗号化をJava(Android)暗号化に変換するヘルプ

c# - Mathos Parser-文字を演算子として使用する

c# - mvc scaffolding rawをデータベースから削除