繁体   English   中英

从 jwt 令牌获取声明到 context.User.Claims

[英]Get claims from jwt token into context.User.Claims

我正在尝试将 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 ://login.microsoftonline.com/[tenant-id]/v2.0

  • 观众: app://[client-id]

和所有组合。 结果相同

最初,尝试使用jwt.ms解码令牌并检查令牌包含的声明。

  • 对于受众参数,您可以使用应用程序 ID URI (api://your_app_id) 或范围( https://graph.microsoft.com )。

  • 对于权限参数,您可以使用颁发令牌的身份验证服务器的地址。 请注意,发行者值根据您生成的令牌类型(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 上下文标头[Authorize] 属性

请检查您是否包含app.UseAuthorization

确保从这个MS Doc中按如下顺序调用中间件:

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();

如果问题仍然存在,请尝试修改Startup.cs -> ConfigureServices()方法,如本博客所述。

您可以参考下面的链接,这些链接可以为您提供一些解决问题的建议:

identityserver4 - User.Claims 是空的 ASP.NET 5.0 - 爱编程的大狗

.NET Core Web API HttpContext.User.Claims 始终为空 - Thinbug

我怀疑你得到了错误类型的 JWT,在 JWT 标头中有一个nonce字段,在你自己的 API 中没有正确验证。 要解决此问题,有一个Expose an API scope选项。

几年前我的 博客文章的第 3 步中有一些关于此的视觉细节。 然后,您可以像我的API 代码示例配置一样配置颁发者和受众。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM