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으로 다시 바꿔줘야 한다.
//후처리 불라불라...
}
하고 본문에가서 다시 리드해보면 바디를 읽을수 있다.
댓글 없음:
댓글 쓰기