加密 web api 请求正文内容并在服务器上解密

Sim*_*erT 2 c# encryption asp.net-web-api

我希望创建一个简单的安全解决方案,它的 Web API 正文内容不是简单地通过使用 Fiddler 或其他东西拦截请求来显示给所有希望看到的人。我受到限制,因为我不能使用 SSL。我已经实现了 HMAC 类型的身份验证,我想通过在客户端上创建正文内容的加密并将该请求发送到服务器,然后服务器将解密正文并按预期转发到操作,从而更进一步解密。我在服务器端 HMAC 上使用了一个过滤器,在客户端上使用了一个 delagatingHandler。

我对处理 http 请求不是很熟悉,也不完全了解如何拦截所有正文内容,然后对其进行加密并将其放回 httpcontent。

任何想法或帮助将不胜感激。

Ane*_*lou 6

为了在 WEB API 中模型映射发生之前解密数据,您可以劫持AuthorizeAttribute, 因为ActionFilterAttribute发生模型映射之后。

我知道 AuthorizeAttribute 是出于另一个原因,但是劫持它对我来说非常有效(我想解压缩 zip 内容)。

    public class DecryptAttribute : AuthorizeAttribute
    {
      public override void OnAuthorization(HttpActionContext actionContext)
      {
              actionContext.Request.Content =  DecryptContect(actionContext.Request.Content);
      }
    }
Run Code Online (Sandbox Code Playgroud)

然后用这个属性装饰你所有的 WebAPI 控制器。

为了压缩并嵌入到正文中,我使用了委托处理程序

    public class EncryptHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>((responseToCompleteTask) =>
        {
            HttpResponseMessage response = responseToCompleteTask.Result;
                response.Content = new EncryptContent(response.Content);

            return response;
        },
        TaskContinuationOptions.OnlyOnRanToCompletion);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后就注册了

GlobalConfiguration.Configuration.MessageHandlers.Add(new EncryptHandler());
Run Code Online (Sandbox Code Playgroud)