从 ASP.NET Core 中的不同 HTTP 标头读取 JWT 令牌

     2023-04-12     54

关键词:

【中文标题】从 ASP.NET Core 中的不同 HTTP 标头读取 JWT 令牌【英文标题】:Read JWT token from different HTTP header in ASP.NET Core 【发布时间】:2021-10-27 17:33:16 【问题描述】:

在 ASP.NET Core API 项目中,我需要验证位于不同于 Authorization 标头的标头中的另一个 JWT Bearer 令牌。例如,假设发送一个 GET 请求以将产品发送到 /api/products,并在名为 AccessToken 的标头中使用 Bearer 令牌。

curl --location --request GET 'https://localhost/api/products' \
--header 'AccessToken: <bearer_token>'

我正在引用 Microsoft.AspNetCore.Authentication.JwtBearer 包并在 API 项目中设置身份验证,如下所示:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => Configuration.Bind("JwtSettings", options));

但是,我在 JwtBearerOptions Class 中找不到任何有关标题名称的信息。

如何配置 JWT 身份验证以从名为“AccessToken”的标头中读取 JWT? 甚至可以使用 Microsoft.AspNetCore.Authentication.JwtBearer 包吗?

【问题讨论】:

根据来源:github.com/dotnet/aspnetcore/blob/…,此中间件只会查看 auth 标头。如果您想做其他事情,则需要自己编写该中间件。 你必须在你的启动中编写一个自定义中间件。 【参考方案1】:

解决方案似乎是使用JwtBearerEvents class。其中有一个委托property named OnMessageReceived ,它“在第一次收到协议消息时调用”。委托将传递MessageReceivedContext 类型的对象,其中有一个名为Token 的属性according to the documentation “这将使应用程序有机会从其他位置检索令牌”

创建一个继承自 JwtBearerEvents 的类,并在 OnMessageReceived 事件中将上下文对象中的令牌设置为标头“AccessToken”中的值。

/// <summary>
/// Singleton class handler of events related to JWT authentication
/// </summary>
public class AuthEventsHandler : JwtBearerEvents

    private const string BearerPrefix = "Bearer ";

    private AuthEventsHandler() => OnMessageReceived = MessageReceivedHandler;

    /// <summary>
    /// Gets single available instance of <see cref="AuthEventsHandler"/>
    /// </summary>
    public static AuthEventsHandler Instance  get;  = new AuthEventsHandler();

    private Task MessageReceivedHandler(MessageReceivedContext context)
    
        if (context.Request.Headers.TryGetValue("AccessToken", out StringValues headerValue))
        
            string token = headerValue;
            if (!string.IsNullOrEmpty(token) && token.StartsWith(BearerPrefix))
            
                token = token.Substring(BearerPrefix.Length);
            

            context.Token = token;
        

        return Task.CompletedTask;
    

最后,在 Startup 类中将 events 类添加到 JWT 身份验证中。

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => 

    Configuration.Bind("JwtSettings", options);
    options.Events = AuthEventsHandler.Instance;
);

【讨论】:

这可行,但是如果找不到令牌,处理程序将回退到检查正常的授权标头。这意味着令牌可以在可能不需要的任一标头中发送。为防止这种情况发生,如果找不到令牌,您需要致电 context.NoResult()。如果处理程序看到结果已设置,它将提前返回,而不是继续正常处理。 伙计,你是一个传奇人物——根本没有关于如何使用 JwtBearerEvents 的资源——这对我帮助很大。我将令牌作为表单内容发布,这允许我使用它而不是 auth 标头。 @pinkfloydx33 你是对的,代码缺少一个部分以避免使用 Authorize 标头的默认设置。我完全错过了,很好!

从 ASP.NET Core Blazor 中的 .NET 方法调用 JavaScript 函数

】从ASP.NETCoreBlazor中的.NET方法调用JavaScript函数【英文标题】:CallJavaScriptfunctionsfrom.NETmethodsinASP.NETCoreBlazor【发布时间】:2021-10-0123:29:00【问题描述】:我想从我的ASP.NETCoreBlazor应用程序调用的JavaScript函数:exportfunctiononClick(map)var... 查看详情

ASP.Net Core 6,SPA,端点 - 我无法从 http get 请求调用控制器

...发布时间】:2022-01-1608:48:38【问题描述】:[已解决]-评论中的解决方案[问题]我是这个行业的新手,所以请原谅我提出一个新手问题,但我现在在ASP.NetCore6上苦苦挣扎,我想我错过了一些简单 查看详情

ASP.NET Web API 与 ASP.NET Core 中的 URL 匹配差异

】ASP.NETWebAPI与ASP.NETCore中的URL匹配差异【英文标题】:UrlmatchingdifferenceinASP.NETWebAPIvsASP.NETCore【发布时间】:2021-06-2414:18:38【问题描述】:我试图找出这两个框架中URL匹配的不同之处我知道以下对于ASP.NetWebAPI是正确的,想知道对... 查看详情

ASP.NET CORE 2.0 中的 FromUri

】ASP.NETCORE2.0中的FromUri【英文标题】:FromUriinASP.NETCORE2.0【发布时间】:2018-06-2001:41:53【问题描述】:这个问题是因为在我使用ASP.NETCORE2.0的MVC项目中,我无法将[FromUri]attribute添加到我的驱动程序中。我尝试使用像System.Web.Http这... 查看详情

HTTP 错误 500.0 - Dot net core 3.1 中的 ASP.NET Core IIS 托管失败(进程中)

】HTTP错误500.0-Dotnetcore3.1中的ASP.NETCoreIIS托管失败(进程中)【英文标题】:HTTPError500.0-ASP.NETCoreIIShostingfailure(in-process)inDotnetcore3.1【发布时间】:2021-07-2115:21:53【问题描述】:**我已经检查了所有可能的方法来解决这个错误,比... 查看详情

从 ASP.NET Web API ASP.NET Core 2 返回 HTML 并获取 http 状态 406

】从ASP.NETWebAPIASP.NETCore2返回HTML并获取http状态406【英文标题】:ReturnHTMLfromASP.NETWebAPIASP.NETCore2andgethttpstatus406【发布时间】:2018-03-2908:38:21【问题描述】:这是ReturnHTMLfromASP.NETWebAPI的后续报道。我按照说明操作,但在浏览器中出... 查看详情

在 ASP.Net Core 3 中从中间件设置 HTTP 身份验证标头

】在ASP.NetCore3中从中间件设置HTTP身份验证标头【英文标题】:SettingHTTPAuthenticationheaderfrommiddlewareinASP.NetCore3【发布时间】:2021-07-1602:13:40【问题描述】:我有一个使用JwtTokenAuthentication的API。services.AddAuthentication(JwtBearerDefaults.Authe... 查看详情

HTTP 错误 500.35 - 同一进程 ASP.NET Core 3 中的 ANCM 多个进程内应用程序

】HTTP错误500.35-同一进程ASP.NETCore3中的ANCM多个进程内应用程序【英文标题】:HTTPError500.35-ANCMMultipleIn-ProcessApplicationsinsameProcessASP.NETCore3【发布时间】:2020-02-0309:46:40【问题描述】:从今天早上开始,项目代码没有任何变化,一个... 查看详情

从 Axios 请求返回 ASP.NET Core API 中的下载文件

】从Axios请求返回ASP.NETCoreAPI中的下载文件【英文标题】:ReturnDownloadFileinASP.NETCoreAPIfromAxiosRequest【发布时间】:2019-08-0322:00:10【问题描述】:大家好,我正在尝试通过Axios请求从ASP.NETCoreWebAPI下载文件。这是我的示例API方法。(... 查看详情

从 ASP.NET Core 1.0 中的 ViewModel 元数据输入占位符

】从ASP.NETCore1.0中的ViewModel元数据输入占位符【英文标题】:InputplaceholderfromViewModelmetadatainASP.NETCore1.0【发布时间】:2016-03-1708:59:30【问题描述】:是否可以设置内置的asp-for标签助手从视图模型中的[Display(Prompt="Thisistheplacehold... 查看详情

从 ASP.Net Core 中的 wwwroot/images 获取图像

】从ASP.NetCore中的wwwroot/images获取图像【英文标题】:Getimagefromwwwroot/imagesinASP.NetCore【发布时间】:2017-07-2401:38:11【问题描述】:我在wwwroot/img文件夹中有一个图像,并想在我的服务器端代码中使用它。如何在代码中获取此图像的... 查看详情

将处理程序添加到 ASP.NET Core 中的默认 http 客户端 [重复]

】将处理程序添加到ASP.NETCore中的默认http客户端[重复]【英文标题】:AddinghandlertodefaulthttpclientinASP.NETCore[duplicate]【发布时间】:2018-08-0121:43:50【问题描述】:有没有办法将处理程序添加到ASP.NETCore中的默认HTTP客户端?像这样?.A... 查看详情

从asp.net core 2.1中的控制器访问BackgroundService

】从asp.netcore2.1中的控制器访问BackgroundService【英文标题】:accessBackgroundServicefromcontrollerinasp.netcore2.1【发布时间】:2018-09-0704:38:06【问题描述】:我只需要从控制器访问我的BackgroundService。由于BackgroundServices被注入了services.AddSing... 查看详情

从 ASP.NET Core 中的 API 读取 JWT 令牌

】从ASP.NETCore中的API读取JWT令牌【英文标题】:ReadingJWTTokenfromAPIinASP.NETCore【发布时间】:2019-08-0308:45:10【问题描述】:我的设置:我已经创建并运行了一个WebAPI解决方案,该解决方案针对源(当前为db)执行用户名和密码的身份... 查看详情

这是从 ASP.NET Core Web API 中的 EF Core 5 获得的啥样的响应 [关闭]

】这是从ASP.NETCoreWebAPI中的EFCore5获得的啥样的响应[关闭]【英文标题】:WhatkindofresponseisthisobtainedfromEFCore5inASP.NETCoreWebAPI[closed]这是从ASP.NETCoreWebAPI中的EFCore5获得的什么样的响应[关闭]【发布时间】:2021-12-2207:28:41【问题描述】:... 查看详情

使用 ASP.NET CORE 中的链接从 Cloudinary 下载 pdf 文件

】使用ASP.NETCORE中的链接从Cloudinary下载pdf文件【英文标题】:DownloadingpdffilefromCloudinaryusinglinkinASP.NETCORE【发布时间】:2021-04-0222:11:53【问题描述】:我想通过单击链接从Cloudinary下载pdf文件。我已经尝试了锚标记的“下载”属性... 查看详情

从 ASP.net Core 2 中的视图访问自定义 ApplicationUser 属性

】从ASP.netCore2中的视图访问自定义ApplicationUser属性【英文标题】:AccesscustomApplicationUserpropertyfromviewinASP.netCore2【发布时间】:2018-04-1317:49:11【问题描述】:我扩展了ApplicationUser类以具有2个额外的属性,FirstName和LastName。这两个属... 查看详情

如何从 ASP.NET Core 中的密码重置令牌中检索用户?

】如何从ASP.NETCore中的密码重置令牌中检索用户?【英文标题】:HowcanIretrieveauserfromapasswordresettokeninASP.NETCore?【发布时间】:2020-05-0417:22:46【问题描述】:我有一个ASP.NETCore2.1Web应用程序,并且正在添加忘记密码功能。我看过几... 查看详情