1. ホーム
  2. c#

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 クラスが他のどこかでインスタンス化され、シングルトンであり、かつ BaseAddresshttp://someexternalapp.com/api/

また、トークン作成/トークン確認は、手動で行うより簡単な方法はありますか?

どのように解決するのですか?

結局、プロキシミドルウェアを実装することになりました。 のプロジェクトに触発されて実装しました。 .

基本的には、受け取ったリクエストを読み、そこからコピーを作成し、設定されたサービスに送り返し、サービスからの応答を読み、呼び出し元に送り返すミドルウェアを実装しています。