【发布时间】:2023-01-23 01:09:08
【问题描述】:
我有一个 ASP.NET Core 应用程序,它使用以下逻辑来配置身份验证/授权。
services.AddAuthorization(
static options => options.AddPolicy(
"Bearer", new AuthorizationPolicyBuilder()
.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
.RequireAuthenticatedUser()
.Build()));
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
options.Authority = identityProviderEndpoint;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = identityProviderEndpoint,
ValidAudience = applicationAudience,
RequireSignedTokens = true,
};
});
现在,这有效,例如,验证来自 Auth0 的令牌。 出于测试目的,我想使用自定义选项(禁用所有检查,因为它在测试时并不重要)。
这是我使用自定义选项创建的测试用例。
[Fact(DisplayName = "HTTP Forbidden: Requesting (Valid JWT) an authorized endpoint (JWT Validation disabled).")]
internal async void RequestingAnEndpointThatRequiresAuthorizationWithAValidJWT()
{
// ARRANGE.
HttpClient httpClient = this.webApplicationFactory.WithWebHostBuilder(
builder =>
{
builder.ConfigureTestServices(
services =>
{
var options = new JwtBearerOptions();
options.TokenValidationParameters = new TokenValidationParameters
{
#pragma warning disable CA5404 //“不要禁用令牌验证检查”- 设计使然。 ValidateIssuer = false, 验证受众=假, 验证生命周期 = 假, #pragma 警告恢复 CA5404 ValidateIssuerSigningKey = false, RequireSignedTokens = false, IssuerSigningKey = new SymmetricSecurityKey( 编码.UTF8.GetBytes("UTrust.S1gn1ngK3Y!")), };
services.AddSingleton(options);
});
})
.CreateClient();
httpClient.DefaultRequestHeaders.Add(
"Authorization",
"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.T7sFpO0XoaJ9JWsu2J1ormK99zs4zIr2s25jjl8RVSw");
// ACT.
HttpResponseMessage result = await httpClient.GetAsync("/authorized")
.ConfigureAwait(false);
// ASSERT.
result.Should()
.HaveStatusCode(HttpStatusCode.OK);
}
我正在传递一个可以在 https://jwt.io/ 上验证的 JWT。 但是,测试失败并显示未经授权的 HTTP 状态代码。
如果在应用程序内部,我将选项更改为我在测试中使用的选项,则相同的标记被视为值,并且我得到一个 HTTP Ok 状态代码。
这是使用以下 cURL 请求验证的。
curl http://localhost:5160/authorized -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.T7sFpO0XoaJ9JWsu2J1ormK99zs4zIr2s25jjl8RVSw" -v
我在这里错过了什么? 为什么令牌在测试上下文中被视为无效,但在实际应用程序中有效(如果我在两者中使用相同的选项)?
【问题讨论】: