Я пытаюсь использовать Web API2, JWT, Microsoft.identityModel.jsonWebtokens 5.2.422 и логику проверки токенов, как указано в этой статье: http://www.decatechlabs.com/secure-webap-using jwth Тестирование 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.");
}
}
};
}
< /code>
Проблема в том, что TokenValidationHandler бросает «ссылку на объект, не установленную на экземпляр объекта». Исключение на второй из двух ниже двух линий обработчика, только когда вызов мой модульный тест с прикрепленным токеном. Если я запускаю обработчик, используя Restlet/Postman/Away, исключение не брошено, и все работает нормально. < /p>
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