将声明从jwt令牌获取到上下文中.用户索赔



我正在尝试将声明从JWT令牌获取到我的ASP.NET Core 5 Web API中的context.User.Claims中。我正在使用Azure,并已在我们租户的Azure AD中注册了一个应用程序。

该代码位于Authorization处理程序中。

当我使用JwtSecurityTokenHandler读取JWT令牌(context.Request.Headers["Authorization"])时,我可以获得所有声明,但我的context.User.Claims仍然是空的。

audiss值显示为:

[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
};
});

我应该在audienceauthority中放入什么?我已经测试了我从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代码示例配置中那样配置发布者和受众。

相关内容

  • 没有找到相关文章

最新更新