我正在尝试将声明从JWT令牌获取到我的ASP.NET Core 5 Web API中的context.User.Claims
中。我正在使用Azure,并已在我们租户的Azure AD中注册了一个应用程序。
该代码位于Authorization
处理程序中。
当我使用JwtSecurityTokenHandler
读取JWT令牌(context.Request.Headers["Authorization"]
)时,我可以获得所有声明,但我的context.User.Claims
仍然是空的。
aud
和iss
值显示为:
[aud, https://graph.microsoft.com]
[iss, https://sts.windows.net/[tenant-id]/]
这是我的Startup.ConfigureServices()
方法:
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(option =>
{
option.Audience = audience;
option.Authority = authority;
option.TokenValidationParameters = new TokenValidationParameters
{
ClockSkew = TimeSpan.FromHours(1),
ValidateLifetime = true,
ValidateIssuer = true,
ValidIssuer = authority,
ValidateAudience = true,
ValidAudience = audience
};
});
我应该在audience
和authority
中放入什么?我已经测试了我从JWT令牌中获得的值(如上)。
我也尝试过:
授权机构(发行人):
https://login.microsoftonline.com/[tenant-id]/v2.0
受众:
app://[client-id]
和所有组合。相同的结果
首先,尝试使用jwt.ms解码令牌,并检查令牌包含哪些声明。
-
对于Audience参数,您可以使用应用程序ID URI(api://your_app_id)或范围(https://graph.microsoft.com)。
-
对于Authority参数,可以使用令牌颁发身份验证服务器的地址。请注意,根据您生成的代币类型(v1.0/v2.0),发行人的值会有所不同。
-
对于v1.0令牌->
https://sts.windows.net< Azure AD Tenant GUID>/
-
对于v2.0令牌->
https://login.microsoftonline.com<Azure AD Tenant GUID>/v2.0
要确认和了解有关参数的更多信息,请参阅Jeffrey Fritz的博客。
若要接收索赔,请确保使用HTTP添加[授权]属性上下文标头
请检查是否包含app.UseAuthorization
。
请确保按照如下顺序从MS Doc:调用中间件
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
如果问题仍然存在,请尝试修改博客中提到的Startup.cs -> ConfigureServices()
方法。
您可以参考下面的链接,这些链接可以为您提供一些解决问题的指针:
identityserver4-用户声明为空ASP.NET 5.0-堆栈溢出
.NET核心Web API HttpContext.User.Claimsare always null-堆栈溢出
我怀疑您得到了错误类型的JWT,JWT头中有一个nonce
字段,该字段在您自己的API中无法正确验证。要解决此问题,有一个Expose an API scope
选项。
在我几年前的博客文章的第三步中,有一些关于这一点的视觉细节。然后,您可以像我的API代码示例配置中那样配置发布者和受众。