Entra OpenID - 客户端无法使用相同的权限和客户端连接到 API

问题描述 投票:0回答:1

我正在关注 Nick Chapsas 的 youtube 视频中的信息。

我按照描述进行了以下设置:

API

builder.Services.AddAuthentication(a =>
{
    a.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    a.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    a.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(b =>
{
    b.TokenValidationParameters = new TokenValidationParameters
    {
        ValidIssuer = builder.Configuration["JwtSettings:Issuer"],
        ValidAudience = builder.Configuration["JwtSettings:Audience"],
        IssuerSigningKey = new SymmetricSecurityKey(
            Encoding.UTF8.GetBytes(builder.Configuration["JwtSettings:Key"]!)),
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true
    };
});

使用 appsettings.json:

"JwtSettings": {
  "Issuer": "https://login.microsoftonline.com/089e76d9-be81-46e6-9249-325211a2cc67/v2.0",
  "Audience": "5e7c53f0-527f-440c-8be2-34dccc1513ef",
  "Key": "myRegisteredApplicationSecret"
}

其中

089e76d9-be81-46e6-9249-325211a2cc67
是(假)租户 ID。

5e7c53f0-527f-440c-8be2-34dccc1513ef
是在 EntraID 上注册的应用程序的(假)clientid。

客户

目前我正在使用 Postman 来尝试运行身份验证。正如尼克所提到的,我称我的端点为:

https://localhost:7049/WeatherForecast

并将标题设置为:

enter image description here

我隐藏了

ey
之后的所有内容,但这是我从前端同事那里收到的完整 JWT 令牌。

在针对同一发行人登录时请求该令牌。它在 Blazor WASM 应用程序上的定义如下:

{
  "AzureAd": {
    "ClientId": "5e7c53f0-527f-440c-8be2-34dccc1513ef",
    "Authority": "https://login.microsoftonline.com/089e76d9-be81-46e6-9249-325211a2cc67/v2.0",
    "ValidateAuthority": true
  }
}

按照我同事的说法,这应该可以工作,但我仍然明白

401 Unauthorized

根据我的邮递员请求的结果。

我尝试删除那些 Validate* tokenValidationParameters,看看设置不那么严格是否有效,但事实并非如此。

我的问题

  1. 我错过了什么吗?
  2. 有没有办法自己生成一个令牌,看看我是否可以让它使用它?

有关于如何正确设置的好资源吗?太多人声称有一个简单的解决方案,但只解释了 1/10 的过程。将所有现有的(几乎相同但足够不同)选项拼凑在一起是非常困难的。

c# blazor openid .net-8.0 microsoft-entra-id
1个回答
0
投票

您提到的视频是将JWT身份验证和授权添加到asp.net core应用程序中,但您想要做的是将Azure AD集成到asp.net core web api中,以便AAD可以保护API,并且前端Blazor WASM 应用程序可以使用访问令牌来调用 API。请注意,API 权限是访问令牌中范围声明的值,这用于令牌验证。这很重要。

因此,我们首先需要将AAD授权方案添加到asp.net core web api中,然后我们应该将AAD身份验证集成到blazor web assembly应用程序中,以便用户可以使用他们的微软帐户登录并生成所需的访问令牌。

让我们按照本教程来保护我们的 Web api。我们也可以参考这个示例。基本上,有 2 个步骤,我们需要在 Azure AD 门户中进行配置(创建 Azure AD 应用程序、公开 API、添加 API 权限、创建客户端密钥、添加重定向 url,请参阅教程中的详细信息)并且我们需要更改我们的 api 代码。让我们创建一个新的 .net 8 Web api 并选择 Microsoft Identity 平台作为身份验证类型。然后去appsettings.json修改AAD相关配置。

enter image description here

"AzureAd": {
  "Instance": "https://login.microsoftonline.com/",
  "Domain": "tenant_id",
  "TenantId": "tenant_id",
  "ClientId": "azure_ad_client_id",
  "Scopes": "API_name_of_your_exposed_API",
  "CallbackPath": "/signin-oidc"
},

然后让我们使用 auth 代码流程测试 API。

首先,尝试下面的请求来获取授权码

https://login.microsoftonline.com/tenant_id/oauth2/v2.0/authorize?
client_id=client_id
&response_type=code
&redirect_uri=redirect_url_you_set
&response_mode=query
&scope=openid
&state=12345
&nonce=abcde

然后您将在浏览器 URL 字段中看到身份验证代码,复制并粘贴以使用它来生成访问令牌。请求url可以在我上面分享的链接中获取,请看我的测试。通过请求标头中的此令牌,我可以成功访问 API。

enter image description here enter image description here

解码token,我们可以看到我们在api中配置的scope,也是我们在AAD中暴露出来的,并添加了API权限。

enter image description here enter image description here

现在 API 已配置良好。

© www.soinside.com 2019 - 2024. All rights reserved.