签名令牌如何工作? (无效的签名错误)

时间:2020-03-09 09:43:00

标签: asp.net-core oauth jwt authorization auth0

背景:我正在.NET Core Web API内运行集成测试,该API使用Auth0对端点进行授权。当我将它们从Auth0返回时,将其粘贴到JWT.io验证程序中时,它们包含“无效签名”。

我在理解授权流程中的哪一点上已对我的令牌进行签名,由谁进行签名以及如何进行签名时遇到了麻烦。

我在Auth0中启动了一个新的开发API(“我的开发API”),该API使用HS256签名算法对我的令牌进行签名。据我了解,对于HS256,有一个用于签名令牌的秘密密钥(签名密钥),并且“机器到机器”的流程如下所示:

我将一些凭据发布到Auth0,就像这样:

clientID: exampleID
clientSecret: exampleSecret
audience: https://myaudience.com
grant_type: client_credentials

Auth0向我发送了访问令牌:

access_token: exampleToken1234

当我将此令牌粘贴到JWT.io中时,会被告知该令牌具有无效的签名。

在我的.NET应用程序中,我进行了一些设置以进行某种配置:

   static void AddAuthentication(IServiceCollection services)
       {
           services.AddAuthentication(options =>
           {
               options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
               options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    }).AddJwtBearer(options =>
        {
              options.TokenValidationParameters = new TokenValidationParameters
         {
               ValidIssuer = auth0Config.Domain,
               ValidAudience = auth0Config.Audience,
               IssuerSigningKey = new 
                        SymmetricSecurityKey(Encoding.UTF8.GetBytes(auth0Config.SigningSecret))
         };
     });
 }

任何人都可以解释一下是否应该添加代码来对该令牌进行签名,是否已经签名(如果可以,为什么JWT.io告诉我存在无效的签名)以及上面的配置实际上在做什么?

此外,是否有必要创建一个独立的Dev API,或者我可以将autho请求发送到预先构建的management-api?

谢谢!

1 个答案:

答案 0 :(得分:2)

当我将它们从Auth0返回时,将其粘贴到JWT.io验证程序中时,它们包含“无效签名”。

https://jwt.io无法验证签名,除非将机密(用于签名令牌的密钥)粘贴到“验证签名”下右栏中的字段中。因此,首先将机密信息粘贴到此处,然后将令牌粘贴到左侧栏中。的顺序很重要!

enter image description here

我在理解授权流程中的哪一点上已经对我的令牌进行了签名,由谁进行签名以及如何进行签名时遇到了麻烦。

AuthO根据所提供的凭据对用户进行身份验证时会为您创建一个已签名的令牌。为了创建令牌,首先创建标头和有效负载,然后将签名计算为标头,有效负载和机密的哈希值。阅读基础知识here

任何人都可以解释我是否应该添加代码来对该令牌进行签名,如果它已经被签名(如果这样,为什么JWT.io告诉我签名无效)

您不需要任何其他签名,您可以从AuthO获得签名的令牌。

以及上面的配置实际上在做什么?

上面的配置告诉您的API使用了基于JWT的身份验证,并且应根据配置的参数(根据auth0Config的值验证颁发者,受众和签名)检查传入的请求是否有效的JWT