私は外部サービスと話すためにJWTトークンを作成する必要があるWebJobを持っています。私は私のローカルマシン上WebJobを実行すると、次のコードは動作します:CryptographicExceptionを取得せずにAzure WebJobでJWTトークンに署名するにはどうすればよいですか?
public static string SignES256(byte[] p8Certificate, object header, object payload)
{
var headerString = JsonConvert.SerializeObject(header);
var payloadString = JsonConvert.SerializeObject(payload);
CngKey key = CngKey.Import(p8Certificate, CngKeyBlobFormat.Pkcs8PrivateBlob);
using (ECDsaCng dsa = new ECDsaCng(key))
{
dsa.HashAlgorithm = CngAlgorithm.Sha256;
var unsignedJwtData = Base64UrlEncoder.Encode(Encoding.UTF8.GetBytes(headerString)) + "." + Base64UrlEncoder.Encode(Encoding.UTF8.GetBytes(payloadString));
var signature = dsa.SignData(Encoding.UTF8.GetBytes(unsignedJwtData));
return unsignedJwtData + "." + Base64UrlEncoder.Encode(signature);
}
}
しかし、私はアズールに私のWebJobを展開するとき、私は次の例外を取得:
Microsoft.Azure.WebJobs.Hostを.FunctionInvocationException:関数の実行中に例外が発生しました:NotificationFunctions.QueueOperation ---> System.Security.Cryptography.CryptographicException:指定されたファイルが見つかりません。 System.Security.Cryptography.CngKey.ImportでSystem.Security.Cryptography.NCryptNative.ImportKey(SafeNCryptProviderHandleプロバイダ、バイト[] keyBlob、文字列形式)(バイト[] keyBlob、CngKeyBlobFormatフォーマット、CngProviderプロバイダ)で
それは指定されたファイルを見つけることができないと言いますが、私が渡しているパラメータはファイルの場所を見ていない、彼らはメモリ内にあります。私が集めたことから、CngKey.Importメソッドを使用できるようにするために必要な暗号化設定があるかもしれませんが、Azureポータルでこれに関する設定を見つけることができません。
私もJwtSecurityTokenHandlerを使用しようとしましたが、使用する必要があるES256ハッシュアルゴリズムを処理していないようです(JwtAlgorithmsクラスでECDSA_SHA256として参照されていますが)。
ご意見をお寄せください。
UPDATEは
CngKey.Importが実際のAzure上でアクセス可能ではないどこかに証明書を保存しようとすることができることが表示されます。私はそれが格納されている必要はありませんので、メモリ内の証明書にアクセスするより良い方法があれば、それは動作するように使いやすくなる別の種類の証明書に変換してください。
UPDATE 2
この問題はhereが述べたように、ユーザープロファイルをロードしない設定AzureのWebアプリケーションIISに関連している可能性があります。 Azureポータルアプリの設定でWEBSITE_LOAD_USER_PROFILE = 1を設定してこれを有効にしました。 AzureのWebJobとWeb Appの両方でコードを実行しているときにこのアップデートを試しましたが、同じエラーが表示されます。
あなたのマシンでローカルに実行しようとすると同じエラーが表示されますか? – Niels
いいえ、WebJobが期待どおりに動作するため、ローカルで実行しているマシン上でローカルに例外がスローされません。 – lehn0058
証明書をどこでインポートしましたか?私はAzureを意味します。 – Thomas