【问题标题】:How to change request body in IActionFilter in asp.net core如何在 asp.net 核心中更改 IActionFilter 中的请求正文
【发布时间】:2019-05-24 14:08:19
【问题描述】:

目前我正在向 asp.net 核心控制器发送加密请求。以下是请求体结构:

{
  "body": "pEbXVvl1ue95eGQywK/q80cGHjYk+2VNPYEgnRgU+vI="
}

在此之前我已经实现了过滤器IActionFilter 所以在OnActionExecuting(ActionExecutingContext context) 我解密上面提到的请求正文(正文密钥)

解密后,我得到解密后的请求体如下:

{
  "Urno":"URN123456"
}

解密后,我想将解密后的请求(上面提到的"Urno":"URN123456")主体传递给控制器​​

我曾尝试将字符串转换为字节而不是将其传递给Request.body,但没有成功:

public void OnActionExecuting(ActionExecutingContext context)
{
    var request = context.HttpContext.Request;
    request.EnableRewind();
    request.Body.Position = 0;
    using (var reader = new StreamReader(request.Body))
    {                   
        var bodyString = reader.ReadToEnd(); //{ "body": "pEbXVvl1ue95eGQywK/q80cGHjYk+2VNPYEgnRgU+vI="}
        if (bodyString != "")
        {
             var data = JObject.Parse(bodyString);
             var key = data.GetValue("body"); 
             var keybytes = Encoding.UTF8.GetBytes("808080808080808011");
             var iv = Encoding.UTF8.GetBytes("8080808080808080111");
             var encrypted = Convert.FromBase64String(key.ToString());
             var decriptedFromJavascript = DecryptStringFromBytes(encrypted, keybytes, iv); //{ "Urno":"URN123456"}
             byte[] bytes = Encoding.ASCII.GetBytes(decriptedFromJavascript);
             request.Body = new MemoryStream(bytes); // here i am trying to change request body
        }
    }
}
   // controller
[HttpPost("[action]")]
public async Task<string> GetInvestorUrno(Urnoinvestor InfoReq){

}


// class
public class Urnoinvestor 
{
    public string Urno{ get; set; }
}

我想更改请求正文并将解密后的请求传递给控制器​​

【问题讨论】:

  • 初始请求使用了什么加密?您需要知道这一点才能解密信息。
  • 我已经解密了请求现在我想更改请求正文
  • 您看到的具体问题是什么?错误消息或空白页?
  • Urnoinvestor InfoReq 为空而不是 { "Urno":"URN123456"} 没有错误

标签: c# asp.net-core


【解决方案1】:

对于您的方案,IActionFilter 不起作用。检查此图像:

Model bindingActionFilter 之前运行,这意味着无论您对 body 进行什么更改,它都不会更改模型。您需要在模型绑定之前尝试过滤器,例如Resource filter

  1. 改成Resource filter

    public class RequestBodyFilter : IResourceFilter
    {
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            //throw new NotImplementedException();
        }
    
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            var request = context.HttpContext.Request;
            request.EnableRewind();
            request.Body.Position = 0;
            using (var reader = new StreamReader(request.Body))
            {
                var decriptedFromJavascript = "{ \"Urno\":\"URN123456\"}"; //{ "Urno":"URN123456"}
                byte[] bytes = Encoding.ASCII.GetBytes(decriptedFromJavascript);
                request.Body = new MemoryStream(bytes); // here i am trying to change request body
            }
        }
    }
    
  2. 由于您是从正文绑定的,因此您需要使用[FromBody] 指定操作作为@Tony Abrams 的建议。

    [HttpPost("[action]")]
    [TypeFilter(typeof(RequestBodyFilter))]
    public async Task<string> GetInvestorUrno([FromBody]Urnoinvestor InfoReq)
    {
        return InfoReq.Urno;
    }
    

【讨论】:

  • 我在 .Net core 3.1 中使用异步版本。身体没有被更换。似乎模型以前是绑定的。有人尝试过吗?
【解决方案2】:

您没有将参数标记为来自正文,因此它不会从请求正文中加载数据。相反,它在 URI 中期待它。

试试这个:

[HttpPost("[action]")]
public async Task<string> GetInvestorUrno([FromBody]Urnoinvestor InfoReq){

}

【讨论】:

  • 正确吗? byte[] bytes = Encoding.ASCII.GetBytes(decritedFromJavascript); request.Body = new MemoryStream(bytes);
  • 试试 System.Text.Encoding.UTF8.GetBytes(decritedFromJavascript) ... 因为其他编码方法使用 UTF8。
  • 不工作我的 decriptedFromJavascript 是字符串 "{ \"Urno\":\"URN123456\"}" 是什么导致了这个问题?我的任何控制器都接受对象
猜你喜欢
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 2017-03-22
  • 2017-11-05
  • 1970-01-01
  • 2019-08-04
  • 2021-12-08
相关资源
最近更新 更多