【问题标题】:How to properly configure OpenIddict with ASP.NET Core DataProtection如何使用 ASP.NET Core DataProtection 正确配置 OpenIddict
【发布时间】:2022-01-15 23:12:04
【问题描述】:

我正在尝试使用 ASP.NET Core DataProtection 设置 OpenIddict,但是在尝试启动应用程序时我不断收到异常:

InvalidOperationException: At least one encryption key must be registered in the OpenIddict server options. Consider registering a certificate using 'services.AddOpenIddict().AddServer().AddEncryptionCertificate()' or 'services.AddOpenIddict().AddServer().AddDevelopmentEncryptionCertificate()' or call 'services.AddOpenIddict().AddServer().AddEphemeralEncryptionKey()' to use an ephemeral key.

现在我明白错误要我做什么了,我需要添加一个签名密钥/加密证书,但是为什么呢?

使用 DataProtection 的重点不是这部分是自动化的,不需要您添加显式签名密钥/加密证书吗? 根据文档,应使用 DataProtection 加密除 JWT id 令牌之外的所有密钥。

这是当前代码:

            if (authenticationOptions.DataProtection.TokenProtection.Enabled)
                services
                    .AddDataProtection(options =>
                    {
                        options.ApplicationDiscriminator = applicationOptions.ShortName;
                    })
                    .SetApplicationName(applicationOptions.Name)
                    .SetDefaultKeyLifetime(TimeSpan.FromDays(authenticationOptions.DataProtection.TokenProtection.LifeTime))
                    .PersistKeysToAzureBlobStorage(CreateDataProtectionBlobClient(azureOptions.BlobStorageUrl, authenticationOptions.DataProtection, azureCredential))
                    .ProtectKeysWithAzureKeyVault(completeKeyVaultUri, azureCredential);
            }

            services.AddOpenIddict()
                .AddCore(options =>
                {
                    options.UseEntityFrameworkCore()
                        .UseDbContext<ApplicationDbContext>()
                        .ReplaceDefaultEntities<long>(); ;
                })
                .AddServer(options =>
                {
                    options.SetAuthorizationEndpointUris("connect/auth");
                    options.SetTokenEndpointUris("/connect/token");

                    options.AllowAuthorizationCodeFlow();
                    options.AllowClientCredentialsFlow();
                    options.AllowRefreshTokenFlow();

                    options.UseAspNetCore()
                        .EnableAuthorizationEndpointPassthrough()
                        .EnableTokenEndpointPassthrough();

                    options.UseDataProtection();
                    //options.AddEphemeralSigningKey();
                    //options.AddEphemeralEncryptionKey();
                })
                .AddValidation(options =>
                {
                    options.UseLocalServer();
                    options.UseAspNetCore();
                    options.UseDataProtection();
                });

【问题讨论】:

    标签: openid-connect openiddict


    【解决方案1】:

    数据保护 API 包含在 Cookie 处理程序中,它的工作是加密会话 cookie。会话 cookie 包含 ClaimsPrincipal 用户对象和可选的令牌。

    就像这张图所示:

    默认情况下,数据保护 API 会创建自己的密钥环,这很棒!但是在生产中,您要确保密钥环在部署中保持不变。如果没有,如果您重新部署,那么您可能无法接受以前生成的 cookie。

    我在这里写过关于这个的博客: https://www.edument.se/post/storing-the-asp-net-core-data-protection-key-ring-in-azure-key-vault?lang=en

    但是,数据保护 API 不参与管理令牌签名密钥。数据保护只是关于保护会话 cookie。因此,您需要提供一个单独的私钥(在外部持久化),因此密钥在您的服务部署中是相同的。

    数据保护 API 只是保护事物,而不是保护什么。这就是为什么您需要单独获取密钥/证书的原因。

    【讨论】:

    • 感谢您的回答,我的数据保护 API 工作正常,这不是问题。我已经使用 Azure Blob Storage/Key Vault 对其进行了配置。我只有将它与 OpenIddict 集成时遇到问题
    • 查看我更新的问题,是否澄清/帮助?
    • 不,这不是问题,OpenIddict 在选项构建器中提供了一个“UseDataProtection()”方法,以便能够使用 DataProtection API 构建访问令牌等:Source。但是,选项生成器仍然要求我提供我认为不需要的签名密钥/证书。
    • 在许多组织中,签名密钥是一件重要的事情,您希望执行各种策略,例如密钥轮换。是的,我认为数据保护 API 只专注于一项任务,加密数据和管理自己的密钥/密钥环是件好事。它并不关心它处理什么。与 HTTPS 证书类似,您也需要单独提供一份...
    • 在 OpenIDConnect 中,您还拥有多种密钥类型、RSA 和 3 种 ECDSA,因此在您看来,数据保护也必须了解所有这些。因此分离职责简化了数据保护 api。
    猜你喜欢
    • 2020-11-01
    • 2017-09-17
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2019-06-09
    • 2022-11-18
    相关资源
    最近更新 更多