【问题标题】:How to use custom Jwt settings when validating Jwt's in a test context?在测试上下文中验证 Jwt 时如何使用自定义 Jwt 设置?
【发布时间】: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

我在这里错过了什么? 为什么令牌在测试上下文中被视为无效,但在实际应用程序中有效(如果我在两者中使用相同的选项)?

【问题讨论】:

    标签: c# jwt


    【解决方案1】:

    您直接在 IC 容器中注册 JwtBearerOptions,因此它不会被配置系统接收。

    您需要将代码更改为如下所示:

    services.Configure(JwtBearerDefaults.AuthenticationScheme, options => {
    // ...
    });
    

    【讨论】:

      猜你喜欢
      • 2020-02-24
      • 2021-11-25
      • 1970-01-01
      • 2021-06-19
      • 2020-04-26
      • 1970-01-01
      • 2016-01-09
      • 2020-06-26
      • 2017-12-10
      相关资源
      最近更新 更多