ASP.NET OAuth Provider中从PrivateKeyBytes迁移至PrivateKey的问题求助(AspNet.Security.OAuth.Apple 3.1.7升级至.NET 6对应版本)
我刚帮几个开发者踩过这个迁移的坑,你的问题根源在于对新版本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

