首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ServiceStack进行不需要用户凭据的自定义JWT验证

使用ServiceStack进行不需要用户凭据的自定义JWT验证
EN

Stack Overflow用户
提问于 2019-09-03 15:50:08
回答 1查看 254关注 0票数 1

我对ServiceStack很陌生,并使用它来提供一个端点来接收来自远程服务的传入请求。不涉及最终用户。

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

  1. “他们的”远程服务调用“我们的”端点,头中有JWT。
  2. “我们的”端点从JWT中提取‘’
  3. “我们的”端点调用他们的“oauth端点,以‘calls’作为参数
  4. oauth端点以JWK (RS256)的形式返回公钥
  5. “我们的”端点使用JWK验证JWT签名

ServiceStack是否支持此身份验证流?

我认为我需要编写连接到请求身份验证并执行上面步骤2-5的代码。是那么回事吗?

编辑:,我找到了看起来是我想要的这个答案,即用上面的步骤2-5覆盖PreAuthenticate的自定义AuthProvider。

代码语言:javascript
复制
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()中:

代码语言:javascript
复制
Plugins.Add(new AuthFeature(() => new AuthUserSession(),
  new IAuthProvider[] {
    new CustomJwtAuthProvider(),
  }));

这种方法似乎正确吗?我需要手动提交JWT身份验证,还是可以更多地利用ServiceStack内置的特性和插件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-03 16:34:01

为了让他们能够向您发送一个ServiceStack接受的经过身份验证的请求的JWT,如果他们使用HMAC-SHA*算法,则您的应用程序需要配置他们的AES密钥,如果他们是使用JWE,则需要配置他们的公钥。

这个流程非常奇怪,对于他们能够向您发送一个定制的JWT密钥--他们需要能够创建自己的JWT密钥--这意味着他们需要您的应用程序配置的AES或私密RSA密钥,而它们将是您唯一能够通过应用程序JWT进行身份验证的密钥?

您不太可能想用远程服务来配置您的应用程序,而应该使用像JWT NuGet软件包这样的JWT库来验证它们发送给您的JWT,然后提取出它们的端点,并使用.NET库(如JWK )来验证它们发送给您的JWK。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57775048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档