JWT в теле запроса вместо заголовка - PullRequest
1 голос
/ 04 октября 2019

Можно ли получить JWT .NET Core API в теле HTTP-запроса вместо заголовка? Я пытался реализовать его самостоятельно, но запросы HTTP POST не работают.

if (ctx.Request.Method.Equals("POST"))
{
    if (ctx.Request.Path.HasValue)
    {
        if (!ctx.Request.Path.Value.Contains("authenticate"))
        {
            using (var ms = new MemoryStream())
            {
                ctx.Request.Body.CopyTo(ms);
                ms.Seek(0, SeekOrigin.Begin);
                using (var reader = new StreamReader(ms))
                {
                    var jsonBody = reader.ReadToEnd();
                    var body = JsonConvert.DeserializeObject<BaseRequest>(jsonBody);
                    ctx.Token = body.Token;
                    ctx.Request.Headers["Authorization"] = $"Bearer {body.Token}";
                }
            }
        }
    }
}

В результате я получаю 400 неверных запросов:

        "errors": {
            "": [
                "A non-empty request body is required."
            ]
        },
        "title": "One or more validation errors occurred.",
        "status": 400,
        "traceId": "800000bf-0002-ff00-b63f-84710c7967bb"

1 Ответ

1 голос
/ 04 октября 2019

Людям, которые попросили меня использовать более общий подход: к сожалению, я не могу этого сделать из-за запросов клиентов, которые я получаю.

Для тех, кому нужна подобная помощь, это в конечном итоге помоглоя:

if (ctx.Request.Method.Equals("POST"))
{
    if (ctx.Request.Path.HasValue)
    {
        ctx.Request.EnableRewind();
        using (var ms = new MemoryStream())
        {
            ctx.Request.Body.CopyTo(ms);
            ms.Seek(0, SeekOrigin.Begin);
            ctx.Request.Body.Seek(0, SeekOrigin.Begin);
            using (var reader = new StreamReader(ms))
            {
                var jsonBody = reader.ReadToEnd();
                var body = JsonConvert.DeserializeObject<BaseRequest>(jsonBody);
                ctx.Token = body.Token;
                ctx.Request.Headers["Authorization"] = $"Bearer {body.Token}";
            }
        }
        return Task.CompletedTask;
    }
}
...