在没有用户凭据的情况下使用 ServiceStack 进行自定义 JWT 验证

Using ServiceStack for custom JWT verification without user credentials

我是 ServiceStack 的新手,我用它来提供一个端点来接收来自远程服务的传入请求。不涉及最终用户。

认证流程如下(由远程服务作者指定):

  1. "Their" 远程服务调用 "our" 端点,在 header
  2. 中使用 JWT
  3. "Our" 端点从 JWT
  4. 中提取 'kid'
  5. "Our" 端点调用 "their" oauth 端点,使用 'kid' 作为参数
  6. "Their" oauth 端点 returns JWK (RS256) 形式的 public 密钥
  7. "Our" 端点使用 JWK
  8. 验证 JWT 签名

ServiceStack 支持这种认证流程吗?

我想我需要编写挂接到请求的身份验证并执行上面的步骤 2-5 的代码。是吗?

编辑: 我发现 看起来正是我所追求的,即自定义 AuthProvider,它使用上面的步骤 2-5 覆盖 PreAuthenticate。

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(),
  }));

这个方法看起来对吗?我需要 hand-roll JWT 身份验证,还是可以更多地利用 ServiceStack 的内置功能和插件?

如果他们使用 HMAC-SHA* 算法或 public RSA 密钥,如果它们是 using JWE

这个流程非常奇怪,为了让他们能够向您发送自定义 JWT 密钥,他们需要能够制作自己的 JWT 密钥,这意味着他们需要您的应用配置的 AES 或私有 RSA 密钥他们将是唯一可以通过 JWT 使用您的应用程序进行身份验证的人?

您不太可能希望使用远程服务来配置您的应用程序,相反,您应该使用像 JWT NuGet Package to just verify the JWT they send you is from them, then extract the KID, call their endpoint and validate the JWK they send you using a .NET library like JWK 这样的 JWT 库来验证它们的密钥。

请注意,此流程独立于 ServiceStack's JWT Support,您将使用后者通过 JWT 为您的服务启用无状态身份验证。在这里,您只是使用 JWT 和 JWK 库来验证它们的密钥并从中提取所需的信息。