Linux和Linux上运行的Docker镜像中的IdentityServer4 Azure存储库&验证问题

时间:2018-05-26 13:54:03

标签: docker asp.net-core jwt identityserver4

我的解决方案包含三个项目:

  1. 承载IdentityServer的ASP.NET MVC Core项目。
  2. 受保护并管理IdentityServer的ASP.NET Core API项目。
  3. 另一个调用API的ASP.NET MVC Core。
  4. 因此,MVC客户端必须在每个请求上向API发送access_token。 如果我使用docker-compose命令运行解决方案,它可以正常工作,但如果我将图像推送到/从Azure存储库中拉出,我就会遇到问题。

    我得到的错误是:ErrorMessage: Bearer error="invalid_token", error_description="The signature key was not found"

    这是我的配置

    services.AddIdentityServer()
        .AddDeveloperSigningCredential()
        .AddAspNetIdentity<ApplicationUser>()
        .AddConfigurationStore(options =>
        {
            options.ConfigureDbContext = builder =>
                builder.UseNpgsql(connectionString,
                    sql => sql.MigrationsAssembly(migrationsAssembly));
        })
        .AddOperationalStore(options =>
        {
            options.ConfigureDbContext = builder =>
                builder.UseNpgsql(connectionString,
                    sql => sql.MigrationsAssembly(migrationsAssembly));
            options.EnableTokenCleanup = true;
            options.TokenCleanupInterval = 30;
        });
    
    services.AddAuthentication(IdentityServerConstants.DefaultCookieAuthenticationScheme)
        .AddIdentityServerAuthentication(options =>
        {
            options.Authority = EnvironmentReader.AuthorityUrl;
            options.ApiName = "api1";
            options.RequireHttpsMetadata = false;
        });
    

1 个答案:

答案 0 :(得分:2)

这是AddDeveloperSigningCredential与AddSigningCredential的问题。每次重新启动IdentityServer时,使用AddDeveloperSigningCredential,密钥材料将更改使用以前密钥材料签名的所有令牌将无法验证。 “临时”实际上仅适用于您没有其他关键材料的情况。

以下内容来自Documentation

中的文档页面
  

<强> AddDeveloperSigningCredential

     

在启动时创建临时密钥材料。当您没有要使用的证书时,这仅适用于dev。生成的密钥将持久保存到文件系统,以便在服务器重新启动之间保持稳定(可以通过传递false来禁用)。这解决了客户端/ api元数据缓存在开发期间不同步时的问题。

VS

  

<强> AddSigningCredential

     

添加签名密钥服务,该服务为各种令牌创建/验证服务提供指定的密钥材料。您可以传入X509Certificate2,SigningCredential或证书存储中对证书的引用。

我的代码:

来自我的配置

 services.AddIdentityServer()
            .AddSigningCredential(LoadCertificate())

额外方法

private X509Certificate2 LoadCertificate()
    {
        return new X509Certificate2("../../certs/TestCertificate.pfx",
            "pass");
    }