Naprawdę nie można tego zrobić na surowej Framework w tej chwili. Nowy serwer APNS oparty na JWT używa tylko protokołu HTTP/2, który system .NET Framework jeszcze nie obsługuje.
wersja NET rdzenia z System.Net.Http
jednak nie, pod warunkiem, że spełniają następujące warunki:
- na Windows, musi być uruchomiony system Windows 10 Anniversary Edition (v1607) lub wyższy, lub równoważną kompilacji Windows Server 2016 (chyba).
- W systemie Linux wymagana jest wersja
libcurl
obsługująca protokół HTTP/2.
- Na MacOS, musisz skompilować
libcurl
z obsługą HTTP/2, a następnie użyć zmiennej środowiskowej DYLD_INSERT_LIBRARIES
, aby załadować niestandardową kompilację libcurl
.
Powinieneś być w stanie używać .NET Core w wersji System.Net.Http
w .NET Framework, jeśli naprawdę chcesz.
Nie mam pojęcia, co dzieje się w Mono, Xamarin lub UWP.
Istnieje wtedy trzy rzeczy trzeba zrobić:
- analizowania klucz prywatny, które zostały podane. Jest to obecnie klucz ECDSA i można go załadować do obiektu
System.Security.Cryptography.ECDsa
.
- W systemie Windows można używać interfejsów API CNG. Po przeanalizowaniu zakodowanej w kodowaniu base64 części DER pliku klucza można utworzyć klucz z numerem
new ECDsaCng(CngKey.Import(data, CngKeyBlobFormat.Pkcs8PrivateBlob))
.
- W systemie MacOS lub Linux nie ma obsługiwanego interfejsu API i trzeba samemu przeanalizować strukturę DER lub użyć biblioteki innej firmy.
- Utwórz token żetona/okaziciela JSON. Jeśli korzystasz z pakietu
System.IdentityModel.Tokens.Jwt
od NuGet, jest to dość proste. Będziesz potrzebować identyfikatora klucza i identyfikatora zespołu od Apple.
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;
}
Wyślij/2 żądania HTTP. To jest normalne, ale trzeba zrobić dwie dodatkowe rzeczy:
- Ustaw
yourRequestMessage.Version
do new Version(2, 0)
w celu uczynienia żądania za pomocą protokołu HTTP/2.
- Ustaw
yourRequestMessage.Headers.Authorization
na new AuthenticationHeaderValue("bearer", token)
w celu dostarczenia tokena uwierzytelniania okaziciela/JWT wraz z żądaniem.
Następnie wystarczy umieścić swój JSON w żądaniu HTTP i POST go pod prawidłowym adresem URL.
Wygląda na to, że używa starego stylu uwierzytelniania, a nie nowego stylu żądanego w PO. –