1

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

身份验证流程如下(由远程服务的作者指定):

  1. “他们的”远程服务调用“我们的”端点,标头中有 JWT
  2. “我们的”端点从 JWT 中提取“孩子”
  3. “我们的”端点调用“他们的”oauth 端点,以 'kid' 作为参数
  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

2

为了让他们能够向您发送 ServiceStack 作为 Authenticated Request 接受的 JWT,如果他们使用算法,您的应用程序需要配置其 AES 密钥;如果他们使用 JWEHMAC-SHA* ,则需要配置其公共 RSA 密钥。

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

您不太可能希望使用远程服务配置您的应用程序,相反,您可能应该使用JWT NuGet 包之类的 JWT 库来验证他们发送给您的 JWT 是否来自他们,然后提取 KID,调用他们的端点并使用 JWK 之类的 .NET 库验证他们发送给您的JWK来验证他们的密钥。

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

于 2019-09-03T16:34:01.123 回答