oauth2.0 ASP.NET Core 7 Web API验证令牌,但控制器仍以401状态响应

vmjh9lq9  于 2023-10-15  发布在  .NET
关注(0)|答案(1)|浏览(181)

我有一个项目,其中包括一个Chrome扩展作为前端和一个ASP.NET Core 7 Web API作为后端。该项目正在使用Azure Entra ID进行OAuth认证。
使用该扩展,我能够成功地检索一个不记名令牌并将其传递给API。API似乎完全验证了令牌,但来自控制器的所有响应都是401状态。
下面是与身份验证/授权相关的Program.cs代码:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));
app.UseHttpsRedirection();
    app.UseCors();
    app.UseAuthentication();
    app.UseAuthorization();
    app.MapControllers();
    app.Run();

这里是我设置的一个准系统控制器,用来测试auth:

[Authorize]
[ApiController]
[Route("controller")]
public class WeatherForecastController : ControllerBase
{
    public WeatherForecastController()
    {
    }

    [HttpGet]
    public ActionResult<string> Test()
    {
        return "Hello";
    }
}

下面是日志的输出(去除了令牌):

info: Microsoft.IdentityModel.LoggingExtensions.IdentityLoggerAdapter\[0\]
Microsoft.IdentityModel Version: 6.32.3.0. Date 10/06/2023 10:56:55. PII logging is ON, do not use in production. See https://aka.ms/IdentityModel/PII for details.
IDX10242: Security token: '{}' has a valid signature.
info: Microsoft.IdentityModel.LoggingExtensions.IdentityLoggerAdapter\[0\]
IDX10239: Lifetime of the token is valid.
info: Microsoft.IdentityModel.LoggingExtensions.IdentityLoggerAdapter\[0\]
IDX10234: Audience Validated.Audience: ''
info: Microsoft.IdentityModel.LoggingExtensions.IdentityLoggerAdapter\[0\]
IDX10245: Creating claims identity from the validated token: '{}'.
info: Microsoft.IdentityModel.LoggingExtensions.IdentityLoggerAdapter\[0\]
IDX10241: Security token validated. token: '{}'.
lndjwyie

lndjwyie1#

根据您的描述,当您添加[Authorize]属性时出现401错误,而没有该属性时得到正确的响应,因此我们可以推测该问题与访问令牌有关。
请允许我先在web API中共享我的配置。除了你分享的代码,我在appsettings.json中有这样的配置:

"AzureAd": {
  "Instance": "https://login.microsoftonline.com/",
  "ClientId": "azure_ad_app_id",
  "ClientSecret": "client_secret",
  "Domain": "tenantId",
  "TenantId": "tenantId",
  //I used the same app to expose an API so in my sample the 2 azure_ad_app_id are the same.
  "Audience": "api://azure_ad_app_id"
},

因为我只使用了[Authorize]属性,所以无论令牌包含roles还是scope,都是可以的,这意味着无论我们使用auth代码流还是客户端凭据流来生成令牌,我们都是有效的。换句话说,如果令牌包含正确的角色或正确的SCP,则令牌是有效的。你可以解码你的令牌来检查它是否包含正确的声明。

让我们看一个客户端凭证流令牌的示例。首先,我公开了一个具有应用程序类型和添加添加API权限的API。

然后我使用客户端凭证流来生成访问令牌。

有了这个令牌,我就可以调用这个API了。

相关问题