生成有效的JWT

时间:2016-05-15 20:42:34

标签: asp.net-core jwt identityserver3 identityserver4

本周末我已经开始使用Identity Server 4了,我对这种轻松感到印象非常深刻,感觉我已经很好地掌握了创建access_token的过程。使用Implicit和ResourceOwner-Flow来创建令牌。

我的问题是我的identityserver3 wep api无法验证创建的JWT,当我使用jwt.io进行手动验证时,它也会失败。

示例令牌:

  

eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Iiwia2lkIjoiRkRFQUE5NTBDRjczODM0MzEwNTZBNzY3Mjc1RTNEMzE5N0VERDJGOSIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0NjMzNDM2MjgsImV4cCI6MTQ2MzM0NzIyOCwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwL3Jlc291cmNlcyIsImNsaWVudF9pZCI6ImJyZnBvcnRhbF9hcGkiLCJzY29wZSI6ImJyZnBvcnRhbGJhY2tlbmQiLCJzdWIiOiIyIiwiYXV0aF90aW1lIjoxNDYzMzQzNjI4LCJpZHAiOiJpZHNydiIsInVuaXF1ZV9uYW1lIjoidGVzdCIsImJyZklkIjowLCJhcHROYnIiOiIwIiwiYW1yIjpbInBhc3N3b3JkIl19.iUvP7jVYSZPXozF0htLbaRrl_iqz_JOIczU5WpIoA5RHfgY17YGN4ERm-8NNPvXQBgJDe2ZeCpLV3MJR4smSOx​​NOBlzWWlgGApl5VauE62L0POxUnwzRFt2OYh5MVcilz0hRaKstB02EPXy-rDmgsNY8u_iT0bPU8bDD0XTETPy7QRldSMNKfUmeMOC0y8RQYypmXlZsO89HlseyfqE4kptruAho_EIp61qQ3CchJrkXwSB9YBWz4PrJHAiEA_ntzskOQ7K_96jQYZDH2NxaIQRKz7RPZWQreZHtnM7tUG6PNYI02raUFF7w8SQFTjjKUBQROcPezKZMtgFiv-c2Ww

我看到的一个问题是根据我的理解,web api会检查

  

http://localhost:5000/.well-known/openid-configuration/jwks

表示公钥中的公钥。公钥是我在“x5c”字段中可以看到的,但当我在jwt.io上使用它进行验证时,它不起作用。

"keys": [
  {
    "kty": "RSA",
    "use": "sig",
    "kid": "_eqpUM9zg0MQVqdnJ149MZft0vk",
    "x5t": "_eqpUM9zg0MQVqdnJ149MZft0vk",
    "x5c": [
      "MIIDFTCC..."
    ]
  }
]
  

FDEAA950CF7383431056A767275E3D3197EDD2F9

是我的证书指纹,与我的JWT的“kid”字段相同。但是jwks响应的“孩子”字段不应该是相同的,那里

这是我在身份服务器中的代码:

为客户端,范围和用户设置具有InMemory配置的identityserver4。这似乎有效,就像在JWT中获取正确的数据一样。

        var certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
        certStore.Open(OpenFlags.ReadOnly);

        var certCollection = certStore.Certificates.Find(
                                   X509FindType.FindByThumbprint,
                                   "FDEAA950CF7383431056A767275E3D3197EDD2F9",
                                   false);

        if (certCollection.Count > 0)
        {
            var cert = certCollection[0];

            var builder = services.AddIdentityServer(options =>
            {
                options.SigningCertificate = cert;
                options.RequireSsl = true;
            });

            builder.AddInMemoryClients(Clients.Get());
            builder.AddInMemoryScopes(Scopes.Get());
            builder.AddInMemoryUsers(Users.Get());
        }

我不是在这里添加我的客户端,范围和用户类,因为我认为问题不存在。

以下是使用IdentityServer3.AccessTokenValidation的Web API中的代码:

        app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
        {
            Authority = "http://localhost:5000",
            RequiredScopes = new[] { "testscope" }
        });

我可以看到我的API从日志中访问身份服务器,但仍然在尝试在我的进程中找到问题后,我一直得到“此请求已拒绝授权”。对于每个请求。

0 个答案:

没有答案