我正在使用 JWT 身份驗證為我的 Web 服務撰寫集成測驗。我想用從真實服務收到的令牌來測驗它。問題是真正的令牌會在 1 小時內過期。
一種可能的方法是options.TokenValidationParameters.ValidateLifetime在下面AddJwtBearer的類Startup中設定。但是,Startupclass 也是一個待測驗的代碼,所以我不想更改或替換它進行測驗。
有沒有一種巧妙的方法來測驗除過期之外的所有 JWT 驗證邏輯?
我的專案代碼:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddAuthentication("JWT")
.AddJwtBearer("JWT", options =>
{
options.Authority = "https://my-real-identity-server.com/";
options.Audience = "...";
// I don't want to disable lifetime validation in real life
// options.TokenValidationParameters.ValidateLifetime = false;
});
// Other stuff
}
public void Configure(IApplicationBuilder app) => app
.UseRouting()
.UseAuthentication()
.UseAuthorization()
.UseEndpoints(endpoints => endpoints.MapControllers());
}
public class TestController : ControllerBase
{
[Authorize]
[HttpGet("/validate")]
public string Get() => "success";
}
我的測驗代碼:
public class HostBuilderTests
{
private IHost testHost;
private CancellationTokenSource cancel;
private HttpClient client;
[SetUp]
public async Task ShouldReturnStatus()
{
testHost = Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(webBuilder =>
webBuilder
.UseStartup<Startup>()
.UseTestServer())
.ConfigureServices(services => services
.AddLogging(b => b.ClearProviders().AddNUnit()))
.Build();
cancel = new CancellationTokenSource(10000);
var server = testHost.Services.GetRequiredService<IServer>()
.ShouldBeOfType<TestServer>();
await testHost.StartAsync(cancel.Token);
client = server.CreateClient();
}
[TearDown]
public async Task TearDown()
{
await testHost.StopAsync(cancel.Token);
client.Dispose();
testHost.Dispose();
cancel.Dispose();
}
[Test]
[TestCase("<<JWT token copied from the real service>>")]
public async Task StatusShouldBeOk(string realToken)
{
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", realToken);
using var response = await client.GetAsync("/validate", cancel.Token);
response.StatusCode.ShouldBe(HttpStatusCode.OK);
}
}
uj5u.com熱心網友回復:
最后,我找到了一種管理身份驗證處理程式選項的簡單方法:
身份驗證方案是一個名稱,對應于:
- 身份驗證處理程式。
- 用于配置處理程式的特定實體的選項。
請參閱MSDN。
因此,在測驗設定JwtBearerOptions中將身份驗證方案名稱指定"JWT"為選項實體名稱就可以進行后配置:
testHost = Host.CreateDefaultBuilder()
// other setup
.ConfigureServices(services => services
.PostConfigure<JwtBearerOptions>("JWT",
op => op.TokenValidationParameters.ValidateLifetime = false)
// other setup
).Build();
也可以通過null而不是"JWT"像評論中寫的那樣:
// Null name is used to configure all named options.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/349446.html
上一篇:如何為重繪令牌生成過期時間?
