我想爲API調用實現自定義加密中間件。首先,我讀取請求正文(IOwinContext.Request.Body
)和標題(加密密鑰&簽名)。然後,我解密請求主體,這給了我純JSON字符串。現在出現棘手的部分:我想將這個json寫回IOwinContextRequest.Body
,所以它可以被反序列化爲對象,並在稍後作爲Controller方法的參數傳遞。這是我做的:更改OWIN Request.Body in middleware
啓動:
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() Exception thrown: 'System.ArgumentException' in System.Web.Extensions.dll
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);
}
現在我認爲控制方法應該接受「原體」,而不是「newBody」,但事實上,我得到這個錯誤:
System.dll!System.Diagnostics.PerformanceCounter.InitializeImpl() Exception thrown: 'System.InvalidOperationException' in System.dll
Additional information: The requested Performance Counter is not a custom counter, it has to be initialized as ReadOnly.
問題是:我的方法有什麼問題?什麼是重寫請求正文的正確方法?有沒有足夠的解決方法? 順便說一句:數據的解密測試是完美無瑕的,所以錯誤不應該出現在那裏。
編輯:在您回答/評論之前,TLS已被使用。這是另一個安全層。我不是在重新發明輪子。我正在添加一個新的。
首先,我想知道爲什麼你會d這種方式不依賴於既定的TLS? – Illuminati
這將在TLS之上 - 另一層。 – MatusMak
對不起,我看不到任何代碼錯誤。但感覺就像你使用WebAPI來做錯事。基本上你正試圖重新發明WCF用證書信任做什麼。 – Illuminati