Page 1 of 1

Unit-Test eines JWT-Tokens mit Web-API

Posted: 25 Jan 2025, 13:04
by Guest
Ich versuche, Web-API2, JWT, Microsoft.IdentityModel.jsonWBtokens 5.2.422 und die in diesem Artikel beschriebene Token-Validierungslogik zu verwenden: http://www.decatechlabs.com/secure-webapi-uswes /p>

Alles funktioniert hervorragend für mein Projekt, wenn ich die Schritte im Artikel wiederhole, einschließlich des Testen der API über Restlet. Ich versuche jedoch, für dieses Projekt die testgetriebene Entwicklung (TDD) zu verwenden, und ich möchte idealerweise testen, dass alles in meinen Tests funktioniert, einschließlich des Token -Validierungs -Handlers. Ich kann meine Controller testen, wenn ich sie direkt in meinen Unit -Tests rufe, aber das umgeht den tatsächlichen Token -Validierungs -Handler. Also habe ich versucht, selbst gehostete HTTP zu verwenden, um die vollständige API, einschließlich der gesamten Token-Validierungs-Handler-Logik, ordnungsgemäß auszuüben. Hier ist mein kompletter Unit -Test, um ein Token zu erhalten und dann das Token an eine zweite Methode zu übergeben, für die Autorisierung erforderlich ist: < /p>

Code: Select all

[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.");
}
}
};
}
Das Problem besteht darin, dass der TokenValidationHandler eine „Objektreferenz, die nicht auf eine Instanz eines Objekts festgelegt ist“ auslöst. Ausnahme in der zweiten der beiden folgenden Zeilen des Handlers, nur wenn sie von meinem Unit-Test mit angehängtem Token aufgerufen wird. Wenn ich den Handler mit Restlet/Postman/was auch immer auslöse, wird keine Ausnahme ausgelöst und alles funktioniert einwandfrei.

Code: Select all

Thread.CurrentPrincipal = handler.ValidateToken(token, validationParameters, out securityToken);
HttpContext.Current.User = handler.ValidateToken(token, validationParameters, out securityToken);
Ich verstehe nicht, was dazu führt, dass nur die zweite Zeile einen Fehler verursacht, wenn die erste, nahezu identische Zeile funktioniert – beide Zeilen rufen dieselbe Methode auf. Und ich verstehe nicht, warum es mit Software von Drittanbietern funktioniert, aber nicht mit meinem Testcode. Ich mache mir Sorgen, dass ich den Code nicht zum Laufen bekomme, wenn ich das für Unit-Tests nicht herausfinde echte Anwendung, die diese API aufruft. Ich gehe davon aus, dass es sich entweder um eine triviale Einstellung in meinem Testcode handelt, die ich vor dem Absenden zu meiner Anfrage hinzufügen muss. Aber vielleicht muss ich in meinen Unit-Tests eine völlig andere Methode zum Aufrufen der API entwickeln.