2021년 3월 22일 월요일

asp.net core 에서 EnableRewind

asp.net core에서
인증이나 권한 검사를 하기위해서
http request 헤더에 토큰을 삽입하고 검사하는 경우가 있다.
그래서 모든 메서드마다 이 검사행위를 기술하면 난잡해지니까
액션필터 어트리뷰트 같은걸써서 request에서 사전검사하고 
검사를 통과하지 못하면 unauthorize 로 리턴한다.

그런데 간혹가다가 이 인증에 관련된 내용이 헤더에만 머물지 않고 
바디에 머무는 경우가 있다..(이러면 안되지만)
그경우 액션필터에서 request Body를 읽어야하는데 읽는건 좋은데
이렇게 한번 읽고나면 스트림이기 때문에 정작 본 함수에가서
body를 읽어서 처리해야하는경우(Json을 읽는다던가) 

body에 내용이 없다.  왜냐면 읽어버렸으니까 position이 end로 가있으니까.

이경우를 대비해서 request를 다시읽을수 있게 해주는 확장메서드가 있는데

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.http.httprequestrewindextensions.enablebuffering?view=aspnetcore-5.0

이거다.

내용을 보아하니  리퀘스트 외에도 뒤에 사이즈를 int로 받고 하는걸 보면
너무많은 내용의 request 를 조절하기위한 장치로 보인다.
2.0 대에서는 enablerewind인가 였는데..  3.0대에서 바뀐것으로 보인다.


-- 엑션필더사용 --

public override void OnActionExecuting(ActionExecutingContext context)
{   
      var req = context.HttpContext.Request;
      var authtoken = req.Headers["Secret"].ToString();
      var bodyStr = string.Empty;
      req.EnableBuffering();          //바디를 다시 읽을수 있게 해주는 확장메서드..
      using (StreamReader reader = new StreamReader(req.Body, Encoding.UTF8, true, 1024, true))
      {
          var ReadTask = reader.ReadToEndAsync();
          bodyStr = ReadTask.Result;
      }
      req.Body.Position = 0;    //스트림이기 때문에 Position을 0으로 다시 바꿔줘야 한다.
      
    //후처리 불라불라...
}

하고 본문에가서 다시 리드해보면 바디를 읽을수 있다.



댓글 없음:

댓글 쓰기