IdentityServer4令牌签名验证

时间:2017-06-16 13:39:03

标签: c# asp.net-core jwt identityserver4

我有IdentityServer4生成签名的JWT令牌。 在我的web api中,我添加了auth中间件来验证这些令牌:

         app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
        {
            Authority = env.IsProduction() ? "https://www.example.com/api/" : "http://localhost/api/",
            AllowedScopes = { "WebAPI", "firm",
                IdentityServerConstants.StandardScopes.OpenId,
                IdentityServerConstants.StandardScopes.Profile },
            RequireHttpsMetadata = env.IsProduction(),
        });

完美无缺。但是,我怀疑它没有验证jwt令牌的签名,因为没有配置公钥来验证令牌。如何配置令牌签名验证?

PS:我试着这样使用UseJwtBearerAuthentication:

        var cert = new X509Certificate2("X509.pfx", "mypassword");
        var TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuerSigningKey = true,
            ValidateIssuer = true,
            ValidIssuer = env.IsProduction() ? "https://www.example.com/api/" : "http://localhost/api/",
            IssuerSigningKey = new X509SecurityKey(cert),
        };
        app.UseJwtBearerAuthentication(new JwtBearerOptions
        {
            Authority = env.IsProduction() ? "https://www.wigwam3d.com/api/" : "http://localhost/api/",
            Audience = "WebAPI",
            RequireHttpsMetadata = env.IsProduction(),
            TokenValidationParameters = TokenValidationParameters
        });

它也有效(我希望验证令牌签名!)但是给了我另一个错误:

UserManager.GetUserAsync(HttpContext.HttpContext.User)

返回null,而使用UseIdentityServerAuthentication返回正确的用户

2 个答案:

答案 0 :(得分:3)

我认为没有必要为您的API添加证书以进行验证。 .UseIdentityServerAuthentication()中间件调用您的IdentiyServer从https://www.example.com/api/.well-known/openid-configuration启动时检索公钥。至少我理解它是如何运作的。

答案 1 :(得分:2)

最后我用JwtBearerAuthentication,

完成了它

GetUserAsync功能失败可以通过调用来解决:

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

因为这个问题:https://github.com/aspnet/Security/issues/1043

欢迎使用IdentityServer身份验证配置相同的任何想法!