API 呼び出し用のカスタム暗号化ミドルウェアを実装したいと考えています。最初に、リクエストのボディ ( IOwinContext.Request.Body
) とヘッダー (Encryption-Key & Signature) を読み取ります。次に、リクエスト本文を復号化します。これにより、純粋な json 文字列が得られます。ここで、注意が必要な部分があります。この json を に書き戻したいIOwinContextRequest.Body
ので、オブジェクトに逆シリアル化し、後で Controller メソッドの引数として渡すことができます。これが私がすることです:
起動:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use(typeof(EncryptionMiddleware));
...
}
}
ミドルウェア:
public class EncryptionMiddleware : OwinMiddleware
{
public EncryptionMiddleware(OwinMiddleware next) : base(next)
{
//
}
public async override Task Invoke(IOwinContext context)
{
var request = context.Request;
string json = GetDecryptedJson(context);
MemoryStream stream = new MemoryStream();
stream.Write(json, 0, json.Length);
request.Headers["Content-Lenght"] = json.Lenght.ToString();
request.Body = stream;
await Next.Invoke(context);
}
}
今、私が得るのはこのエラーです:
System.Web.Extensions.dll!System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject() 例外がスローされました: System.Web.Extensions.dll の 'System.ArgumentException'
Additional information: Invalid JSON primitive: 8yi9OH2JE0H0cwZ.
元の場所IOwinContext.Request.Body
:
8yi9OH2JE0H0cwZ/fyY5Fks4nW(...omitted...)PvL32AVRjLA==
したがって、この方法でリクエストボディを変更することはできないと想定しました。これをテストするために、ミドルウェアを次のように書き直しました。
public async override Task Invoke(IOwinContext context)
{
var request = context.Request;
string requestBody = new StreamReader(request.Body).ReadToEnd();
Debug.WriteLine(requestBody); // Prints "ORIGINAL BODY"
string newBody = "\"newBody\"";
MemoryStream memStream = new MemoryStream(Encoding.UTF8.GetBytes(newBody));
request.Headers["Content-Length"] = newBody.Length.ToString();
request.Body = memStream;
await Next.Invoke(context);
}
Controllerメソッドは「newBody」ではなく「ORIGINAL BODY」を受け取るべきだと思ったのですが、実際には次のエラーが発生しました。
System.dll!System.Diagnostics.PerformanceCounter.InitializeImpl() 例外がスローされました: System.dll の 'System.InvalidOperationException'
追加情報: 要求されたパフォーマンス カウンターはカスタム カウンターではないため、ReadOnly として初期化する必要があります。
問題は、私のアプローチの何が問題なのですか? リクエストボディを書き換える正しい方法は何ですか? 十分な回避策はありますか? ところで: データの復号化はテスト済みで完璧であるため、エラーが発生することはありません。
編集:回答/コメントする前に、TLS は既に使用されています。これは、セキュリティのもう 1 つのレイヤーです。私は車輪を再発明しているわけではありません。新しいものを追加しています。