Azure AD Jwt Bearer令牌

3

我正在尝试构建一个具有SPA UI和Web API的应用程序,该应用程序使用Jwt Bearer令牌进行访问控制。我可以验证用户并将Bearer令牌发送到Web请求,但是当我这样做时,我会收到以下错误:

Bearer未经过身份验证。失败消息:IDX10500:签名验证失败。未提供安全密钥以验证签名。

我希望中间件使用在以下位置找到的密钥集:

https://login.microsoftonline.com/common/discovery/keys

但很明显我错过了什么。下面是我的启动代码片段,用于配置Bearer令牌。请问有谁能指出我的错误所在?

    var clientId = Configuration["AzureAd:ClientId"];
    var tenantId = Configuration["AzureAd:TenantId"];
    var issuer = $"https://sts.windows.net/{tenantId}/";

    services.AddAuthentication(options =>
    {
       options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
       options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
     })
      .AddJwtBearer(options =>
      {
        options.RequireHttpsMetadata = false;
        options.SaveToken = true;
        options.Authority = "https://login.microsoftonline.com/common/";

        options.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidateIssuer = true,
            ValidIssuer = issuer,
            ValidateAudience = true,
            ValidAudiences = new string[] { clientId },
            ValidateLifetime = true
        };
      });

完全有同样的问题。 - Ben Temple-Heald
看着同样的错误,我自己也一样。 - Alex Dresko
1个回答

0

好的,我刚刚在我的代码中修复了这个问题,虽然我仍在学习所有这些新东西的工作原理。对我来说,即使 ValidateIssuerSigningKey 被设置为 false,我仍需要设置 IssuerSigningKey。我不知道是否需要特定的值,但我将其设置为我签署 JWT 令牌时使用的相同值。

options.TokenValidationParameters = new TokenValidationParameters
{
    ValidateAudience = false,
    ValidateLifetime = false,
    ValidateIssuer = false,
    ValidateIssuerSigningKey = false,
    IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("this is super secret")),
    ValidateActor = false
};

1
在我看来,你只是禁用了令牌验证。我不想使用未经验证的令牌,因为担心人们会提供伪造的令牌。 - GlennSills
这并不一定是重点。最终,我开始验证令牌。问题在于IssuerSigningKey没有设置。 - Alex Dresko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接