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

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

Сообщение Anonymous »

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

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

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

[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);
< /code>

Я не понимаю, что вызывает только вторую строку, когда первая, почти идентичная строка работает - обе строки называют один и тот же метод. И я не понимаю, почему это работает со сторонним программным обеспечением, но не работает с моим тестовым кодом - я обеспокоен тем, что если я не выясню это для модульного тестирования, то я не получаю код, работающий на Реальное приложение, вызывая этот API. Я предполагаю, что это либо какая -то тривиальная настройка в моем тестовом коде, которую мне нужно добавить в свой запрос перед отправкой. Но, возможно, мне нужно архитектировать совершенно другой метод вызова API в моих модульных тестах.

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

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

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

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

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

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