You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET OAuth Provider中从PrivateKeyBytes迁移至PrivateKey的问题求助(AspNet.Security.OAuth.Apple 3.1.7升级至.NET 6对应版本)

解决AspNet.Security.OAuth.Apple 6.0.0中PrivateKeyBytes到PrivateKey的迁移问题

我刚帮几个开发者踩过这个迁移的坑,你的问题根源在于对新版本PrivateKey属性的输入格式理解偏差了,咱们拆解问题一步步修正:

为什么会触发这个错误?

旧版本的PrivateKeyBytes接收的是Base64解码后的PEM私钥字节数组——你把配置里的Base64字符串转成字节后,内部会把这些字节当作PEM格式内容解析。

但新版本的PrivateKey属性要求的是PEM格式文本字符串的ReadOnlyMemory<char>,而你直接把原始Base64字符串转成Memory<char>传给它,相当于告诉库"这就是PEM内容",但实际上这只是PEM内容的Base64编码文本,库自然识别不了,所以抛出了"No supported key formats were found"的错误。

正确的迁移代码

你需要先把Base64字符串解码成字节,再把这些字节转换成UTF-8格式的PEM文本字符串,最后转成ReadOnlyMemory<char>:

string appleKeySecret = configuration.GetValue("AppSettings:AppleKeySecret", string.Empty);

authenticationBuilder.AddApple("Apple", "Apple", options => {
    options.SignInScheme = AuthenticationSchemeConstants.ExternalCookieAuthenticationScheme;
    options.ClientId = appleClientId;
    options.KeyId = appleKeyId;
    options.TeamId = appleTeamId;
    options.GenerateClientSecret = true;
    options.PrivateKey = (keyId, _) => {
        // 1. 将Base64字符串解码为PEM字节
        var pemBytes = Convert.FromBase64String(appleKeySecret);
        // 2. 将字节转换为UTF-8格式的PEM文本字符串
        var pemString = Encoding.UTF8.GetString(pemBytes);
        // 3. 返回字符串的ReadOnlyMemory<char>
        return Task.FromResult(pemString.AsMemory());
    };
});

额外验证提示

如果你的配置里AppleKeySecret是直接存储的完整PEM文本(比如带-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----的字符串),那直接用appleKeySecret.AsMemory()即可,但根据你旧版本代码使用Convert.FromBase64String的逻辑,说明配置存的是PEM的Base64编码,所以上面的三步转换是必须的。

另外,转字符串时用UTF-8编码是安全的——PEM标准基于ASCII,而UTF-8完全兼容ASCII,不会出现编码乱码问题。

内容的提问来源于stack exchange,提问作者JonHendrix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 14:32:40