1

私は ServiceStack を初めて使用し、それを使用して、リモート サービスから着信要求を受信するエンドポイントを提供しています。エンドユーザーは関与しません。

認証フローは次のようになります (リモート サービスの作成者が指定)。

  1. 「彼らの」リモート サービスが「私たちの」エンドポイントを呼び出し、ヘッダーに JWT が含まれる
  2. 「私たちの」エンドポイントは、JWT から「子供」を抽出します
  3. 「私たちの」エンドポイントは、「子供」をパラメータとして「彼らの」oauthエンドポイントを呼び出します
  4. 「彼らの」oauth エンドポイントは、JWK (RS256) の形式で公開鍵を返します。
  5. 「私たちの」エンドポイントは、JWK を使用して JWT 署名を検証します

ServiceStack はこの認証フローをサポートしていますか?

リクエストの認証にフックし、上記の手順 2 ~ 5 を実行するコードを記述する必要があると思います。そうですか?

編集:私が求めているものと思われるこの回答 を見つけました。つまり、上記の手順2〜5でPreAuthenticateをオーバーライドするカスタムAuthProviderです。

using System;
using ServiceStack;
using ServiceStack.Auth;
using ServiceStack.Web;

namespace MyService
{
  public class CustomJwtAuthProvider : AuthProvider, IAuthWithRequest
  {
    public CustomJwtAuthProvider ()
    {
      Provider = "CustomJwtAuthProvider";
      AuthRealm = "/auth/CustomJwtAuthProvider";
    }
    public override bool IsAuthorized(IAuthSession session, IAuthTokens tokens, Authenticate request = null)
    {
      return session.IsAuthenticated;
    }

    public override object Authenticate(IServiceBase authService, IAuthSession session, Authenticate request)
    {
      throw new NotImplementedException("Authenticate() should not be called directly");
    }

    public void PreAuthenticate(IRequest req, IResponse res)
    {
      // Get kid from JWT
      // Get public JWK from oauth endpoint
      // Verify JWT signature using JWK
      if ( /* JWT sig verified */ ) 
      {
        req.Items[Keywords.Session] = new AuthUserSession
        {
          IsAuthenticated = true,
        };
      }
    }
  }
}

次に、ApplicationHost.Configure() で:

Plugins.Add(new AuthFeature(() => new AuthUserSession(),
  new IAuthProvider[] {
    new CustomJwtAuthProvider(),
  }));

このアプローチは正しいと思いますか? JWT 認証を手動で行う必要がありますか、それとも ServiceStack の組み込み機能とプラグインをさらに活用できますか?

4

1 に答える 1