ASP.NET Core OpenIdConnectServer数据保护密钥位置

rud*_*ias 5 c# openid-connect aspnet-contrib asp.net-core asp.net-core-1.0

你好,

在我的ASP.NET Core应用程序中,我正在使用OpenIdConnectServer进行Api身份验证。一切正常。

但是我无法解决一件事-如何设置自定义文件夹以保留令牌签名密钥?

在服务配置中,我有:

services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(@"keys/"));
Run Code Online (Sandbox Code Playgroud)

首次运行后,将在此处创建一个应用程序密钥。但是OpenIdServer可以自行管理密钥。

app.UseOpenIdConnectServer(options => {
    ...
    options.DataProtectionProvider = app.ApplicationServices.GetDataProtectionProvider();
    ...
});
Run Code Online (Sandbox Code Playgroud)

尽管如此,凭据签名密钥还是在默认位置创建的:

 A new RSA key ... persisted on the disk: /home/.../.aspnet/aspnet-contrib/oidc-server/<some guid>.key.
Run Code Online (Sandbox Code Playgroud)

那是错误还是功能?如何强制服务器将密钥也存储在keys/文件夹中?


摘要-为什么要这样做

我的想法是从n个 docker镜像构建一个API ,将其隐藏在负载平衡器之后,然后在云中运行。问题是-当docker中的每个实例创建其自己的应用程序和签名密钥时,加密的auth令牌将不适用于除已用其密钥创建并签名令牌的其他实例以外的任何其他实例。因此,我试图将相同的密钥分配给每个运行的docker映像。如果可能,到预定义的应用程序文件夹。

还是有更好的方法或最佳做法?


预先谢谢你。

rud*_*ias 5

嗯,我想通了。

首先,我们必须按照此处所述生成 x509 证书(带有私钥)

openssl genrsa -out private.key 1024
openssl req -new -x509 -key private.key -out publickey.cer -days 365
openssl pkcs12 -export -out certificate.pfx -inkey private.key -in publickey.cer
Run Code Online (Sandbox Code Playgroud)

key/certificate.pfx在这种情况下,将其复制到您喜欢的文件夹中。

然后,将您的新证书轻轻插入 OpenIdConnectServer:

appsettings.json

"Keys": {
    "CertificatePath": "keys/certificate.pfx",
    "CertificatePassword": "<password you provider>"
}
Run Code Online (Sandbox Code Playgroud)

启动文件

private X509Certificate2 CreateOauthCertificate(){
        var path = Configuration["Keys:CertificatePath"];
        var password = Configuration["Keys:CertificatePassword"];
        return new X509Certificate2(path, password);
    }
Run Code Online (Sandbox Code Playgroud)

Starup.cs - 配置

app.UseOpenIdConnectServer(
    ...
    options.SigningCredentials.AddCertificate(CreateOauthCertificate());
    ...
});
Run Code Online (Sandbox Code Playgroud)

现在我很好奇是否有更好的方法。

但这有效。

问候