我正在关注 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
并将标题设置为:
我隐藏了
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/10 的过程。将所有现有的(几乎相同但足够不同)选项拼凑在一起是非常困难的。
您提到的视频是将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相关配置。
"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。
解码token,我们可以看到我们在api中配置的scope,也是我们在AAD中暴露出来的,并添加了API权限。
现在 API 已配置良好。