Asp.net coreで別のWeb APIへのプロキシを作成する
2023-10-02 03:58:46
質問
ASP.Net CoreのWebアプリケーションを開発しているのですが、別の(外部の)Webサービスに対する一種のquot;認証プロキシを作成する必要があります。
認証プロキシとは、私の Web アプリケーションの特定のパスを介してリクエストを受け取り、それらのリクエストのヘッダーをチェックして、私が以前に発行した認証トークンを確認し、同じリクエスト文字列/コンテンツを持つすべてのリクエストを、私のアプリケーションが HTTP Basic 認証を介して認証する外部の Web API にリダイレクトするという意味です。
以下は擬似的なプロセス全体です。
- クライアントは、私が以前に送った固有の URL に POST してトークンを要求します。
- 私のアプリは、このPOSTへの応答として一意のトークンを送信します。
-
クライアントが私のアプリの特定の URL に GET リクエストを行う。
/extapi
とし、HTTPヘッダーにauth-tokenを追加します。 - 私のアプリはリクエストを取得し、auth-token が存在し有効であることをチェックします。
- 私のアプリは、外部のWeb APIに同じリクエストを行い、BASIC認証を使用してリクエストを認証します。
- 私のアプリはリクエストから結果を受け取り、クライアントに送り返します。
これが今のところ私が持っているものです。うまくいっているように見えますが、これが本当にすべき方法なのか、もっとエレガントで優れた解決策はないのか、疑問に思っています。その解決策は、アプリケーションをスケーリングするために長期的に問題を引き起こす可能性がありますか?
[HttpGet]
public async Task GetStatement()
{
//TODO check for token presence and reject if issue
var queryString = Request.QueryString;
var response = await _httpClient.GetAsync(queryString.Value);
var content = await response.Content.ReadAsStringAsync();
Response.StatusCode = (int)response.StatusCode;
Response.ContentType = response.Content.Headers.ContentType.ToString();
Response.ContentLength = response.Content.Headers.ContentLength;
await Response.WriteAsync(content);
}
[HttpPost]
public async Task PostStatement()
{
using (var streamContent = new StreamContent(Request.Body))
{
//TODO check for token presence and reject if issue
var response = await _httpClient.PostAsync(string.Empty, streamContent);
var content = await response.Content.ReadAsStringAsync();
Response.StatusCode = (int)response.StatusCode;
Response.ContentType = response.Content.Headers.ContentType?.ToString();
Response.ContentLength = response.Content.Headers.ContentLength;
await Response.WriteAsync(content);
}
}
_httpClient
である
HttpClient
クラスが他のどこかでインスタンス化され、シングルトンであり、かつ
BaseAddress
の
http://someexternalapp.com/api/
また、トークン作成/トークン確認は、手動で行うより簡単な方法はありますか?
どのように解決するのですか?
結局、プロキシミドルウェアを実装することになりました。 のプロジェクトに触発されて実装しました。 .
基本的には、受け取ったリクエストを読み、そこからコピーを作成し、設定されたサービスに送り返し、サービスからの応答を読み、呼び出し元に送り返すミドルウェアを実装しています。
関連
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み] ASP.NET WebサイトとASP.NET Webアプリケーションのどちらを選ぶか?
-
[解決済み] ASP.NET CoreでカスタムのAuthorizeAttributeを作成する方法は?
-
[解決済み] ConfigureServices内からASP.NET Core DIでインスタンスを解決する
-
[解決済み] ASP.NET Core Web APIの例外処理
-
[解決済み】ASP.NET Core RC2 Web ApiからHTTP 500を返すには?
-
[解決済み] ASP.NET Coreのトークンベース認証
-
[解決済み] ASP.NET Web APIでのユーザー認証
-
[解決済み] ASP.NET Web API : 401/unauthorized レスポンスを返すための正しい方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み] [Solved] アセンブリ System.Web.Extensions dll はどこにありますか?
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み] 関数を終了するには?
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない