我想要做的是使用Apple的基于新令牌的身份验证(.p8文件),但我找不到有关服务器部分的更多信息.
我发现了以下帖子:
How to use APNs Auth Key (.p8 file) in C#?
然而,答案并不令人满意,因为没有太多关于如何:
解决方法
但是,只要满足以下先决条件,.NET Core的System.Net.Http版本就可以了:
>在Windows上,您必须运行Windows 10 Anniversary Edition(v1607)或更高版本,或Windows Server 2016的等效版本(我认为).
>在Linux上,您必须具有支持HTTP / 2的libcurl版本.
>在macOS上,您必须编译支持HTTP / 2的libcurl,然后使用DYLD_INSERT_LIBRARIES环境变量来加载libcurl的自定义构建.
如果您真的想要,您应该能够在.NET Framework中使用.NET Core的System.Net.Http版本.
我不知道Mono,Xamarin或UWP会发生什么.
那么你需要做三件事:
>解析您已获得的私钥.这是当前的ECDSA密钥,您可以将其加载到System.Security.Cryptography.ECDsa对象中.
>在Windows上,您可以使用CNG API.在解析密钥文件的base64编码的DER部分之后,您可以使用新的ECDsaCng(CngKey.Import(data,CngKeyBlobFormat.Pkcs8PrivateBlob))创建密钥.
>在macOS或Linux上,没有受支持的API,您必须自己解析DER结构,或使用第三方库.
>创建JSON Web令牌/承载令牌.如果您使用NuGet的System.IdentityModel.Tokens.Jwt包,这非常简单.您将需要Apple的密钥ID和团队ID.
public static string CreateToken(ECDsa key,string keyID,string teamID) { var securityKey = new ECDsaSecurityKey(key) { KeyId = keyID }; var credentials = new SigningCredentials(securityKey,"ES256"); var descriptor = new SecurityTokenDescriptor { IssuedAt = DateTime.Now,Issuer = teamID,SigningCredentials = credentials }; var handler = new JwtSecurityTokenHandler(); var encodedToken = handler.CreateEncodedJwt(descriptor); return encodedToken; }
>发送HTTP / 2请求.这是正常的,但你需要做两件额外的事情:
>将yourRequestMessage.Version设置为新版本(2,0),以便使用HTTP / 2发出请求.
>将yourRequestMessage.Headers.Authorization设置为新的AuthenticationHeaderValue(“bearer”,token),以便为您的请求提供承载身份验证令牌/ JWT.
然后将您的JSON放入HTTP请求并将其POST到正确的URL.