2017-01-18 8 views
3

トークン化を使用してAPNにプッシュ通知を送信しようとしています。私はJWTトークンを作成するためにjose-jwtやMicrosot Jwtクラスのようなライブラリをいくつか使用しようとしましたが、私の周りを頭で囲むことはできません。APNトークン化のためのJWTのエンコード方法(.NET、C#)

私はJWTを作成して秘密鍵で署名することに固執します。

証明書と通信するために、私はPushSharpを使用していましたが、うまくいきました。誰も私の助けてもらえますか?

編集:ここでは、Appleのドキュメントを次のようhttps://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html#//apple_ref/doc/uid/TP40008194-CH11-SW1

サンプルコード:私は何かに来た最も近いが、このようになりますが、私はきちんと

var payload = new Dictionary<string, object>() 
      { 
       { "iss", issuer }, 
       { "iat", DateTime.UtcNow } 
      }; 

var headers = new Dictionary<string, object>() 
      { 
       { "kid", keyIdentifier} 
      }; 

CngKey key = CngKey.Create(CngAlgorithm.ECDsaP256); //how to create this CngKey 

string token = Jose.JWT.Encode(payload, key, JwsAlgorithm.ES256, headers); 
+0

私たちが見ることができるようにいくつかのコードを含めることができますか?あなたは一般的な質問をしているので、私はこれを読むことをお勧めします:https://stormpath.com/blog/token-authentication-asp-net-core – Valkyrie

+0

ありがとう、私はそれを調べます。私がどこにいるのかを示すコードサンプルを追加しました。 – user3790083

答えて

3

あなたの答えをありがとう、これを行うには多くのサポートに連絡しなければならなかった。最終的な結果は次のようになります。

/// <summary> 
    /// Method returns ECDSA signed JWT token format, from json header, json payload and privateKey (pure string extracted from *.p8 file - PKCS#8 format) 
    /// </summary> 
    /// <param name="privateKey">ECDSA256 key</param> 
    /// <param name="header">JSON header, i.e. "{\"alg\":\"ES256\" ,\"kid\":\"1234567899"\"}"</param> 
    /// <param name="payload">JSON payload, i.e. {\"iss\":\"MMMMMMMMMM"\",\"iat\":"122222222229"}"</param> 
    /// <returns>base64url encoded JWT token</returns> 
    public static string SignES256(string privateKey, string header, string payload) 
    { 
     CngKey key = CngKey.Import(
      Convert.FromBase64String(privateKey), 
      CngKeyBlobFormat.Pkcs8PrivateBlob); 

     using (ECDsaCng dsa = new ECDsaCng(key)) 
     { 
      dsa.HashAlgorithm = CngAlgorithm.Sha256; 
      var unsignedJwtData = 
       Url.Base64urlEncode(Encoding.UTF8.GetBytes(header)) + "." + Url.Base64urlEncode(Encoding.UTF8.GetBytes(payload)); 
      var signature = 
       dsa.SignData(Encoding.UTF8.GetBytes(unsignedJwtData)); 
      return unsignedJwtData + "." + Url.Base64urlEncode(signature); 
     } 
    } 
+0

これを行うためにあなたがしたことについてコメントできますか?ここにいなければ必要な答えを見つけた場所を説明してください。 – Mike

+0

Jose-jwtフォーラムとAppleサポート。上記のBase64エンコーディングが機能しなくなっていました。アップルの人たちは、結局のところ、ヒントとともに上記のコードを形成しました。私はC#の作業例のための公式文書を見つけることができませんでした。 – user3790083

+0

実際に通知をAppleサーバーに送信した方法に関するヒントはありますか?私はそれを動作させるために多くのことを試しましたが、運はありません。コードをお持ちの場合は、非常に感謝しています! –

2

をCngKeyを作成する方法がわからない。ここで私が使っているもの:

var privateKeyContent = System.IO.File.ReadAllText(AUTHKEYFILE); 
var privateKey = privateKeyContent.Split('\n')[1]; 
var secretKeyFile = Convert.FromBase64String(privateKey); 
var secretKey = CngKey.Import(secretKeyFile,CngKeyBlobFormat.Pkcs8PrivateBlob); 
+0

あなたの答えをありがとう、すでに解決策があった。ただそれを追加しました。たぶんあなたはそれを使うことができます。 – user3790083