Модульное тестирование токена JWT с помощью веб-APIC#

Место общения программистов C#
Ответить
Anonymous
 Модульное тестирование токена JWT с помощью веб-API

Сообщение Anonymous »

Я пытаюсь использовать Web API2, JWT, Microsoft.IdentityModel.JsonWebTokens 5.2.422 и логику проверки токена, как описано в этой статье: http://www.decatechlabs.com/secure-webapi-using-jwt

В моем проекте все отлично работает, когда я повторяю шаги, описанные в статье, включая тестирование API через Restlet. Однако я пытаюсь использовать для этого проекта разработку через тестирование (TDD), и в идеале мне хотелось бы проверить, что в моих тестах все работает, включая обработчик проверки токена. Я могу тестировать свои контроллеры, если вызываю их непосредственно в своих модульных тестах, но это обходится в обход фактического обработчика проверки токена. Итак, я попробовал использовать автономный HTTP для правильной работы всего API, включая всю логику обработчика проверки токена. Вот мой полный модульный тест для получения токена и его последующей передачи второму методу, требующему авторизации:

Код: Выделить всё

[TestMethod]

public void GetAuthorizedStatus_SelfHostedHTTP()
{
HttpServer server = TestAPIHelper.GenerateTestServer();

using (HttpMessageInvoker client = new HttpMessageInvoker(server))
{
string token = string.Empty;

using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, loginURL))
{
var stringContent = new StringContent(JsonConvert.SerializeObject(TestAPIHelper.loginObject), Encoding.UTF8, "application/json");
request.Content = stringContent;

using (HttpResponseMessage response = client.SendAsync(request, System.Threading.CancellationToken.None).Result)
{
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode, "Error getting token from login portion");

token = response.Content.ReadAsAsync().Result;
Assert.IsTrue(token.Length > 50);
}
}

using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, authorizedStatusURL))
{
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);

using (HttpResponseMessage response = client.SendAsync(request, System.Threading.CancellationToken.None).Result)
{
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode, "Error getting status from Authenticated portion.");
}
}
};
}
Проблема в том, что TokenValidationHandler выдает «Ссылка на объект не установлена ​​на экземпляр объекта». исключение во второй из двух строк обработчика, приведенных ниже, только при вызове моего модульного теста с прикрепленным токеном. Если я запускаю обработчик с помощью Restlet/Postman/что-то еще, никаких исключений не создается, и все работает нормально.

Код: Выделить всё

Thread.CurrentPrincipal = handler.ValidateToken(token, validationParameters, out securityToken);
HttpContext.Current.User = handler.ValidateToken(token, validationParameters, out securityToken);
Я не понимаю, почему возникает ошибка только во второй строке, когда работает первая, почти идентичная строка — обе строки вызывают один и тот же метод. И я не понимаю, почему он работает со сторонним программным обеспечением, но не работает с моим тестовым кодом — меня беспокоит то, что если я не разберусь с этим для модульного тестирования, то я не получу код, работающий для реального приложения, вызывающего этот API. Я предполагаю, что это либо какой-то тривиальный параметр в моем тестовом коде, который мне нужно добавить в свой запрос перед отправкой. Но, возможно, мне нужно разработать совершенно другой метод вызова API в моих модульных тестах.

Подробнее здесь: https://stackoverflow.com/questions/513 ... th-web-api
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»