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

Posted

技术标签:

【中文标题】在 ASP.Net Core 3 中从中间件设置 HTTP 身份验证标头【英文标题】:Setting HTTP Authentication header from middleware in ASP.Net Core 3 【发布时间】:2021-07-16 02:13:40 【问题描述】:

我有一个使用 JwtTokenAuthentication 的 API。

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

我希望 API 能够使用 <img> 标记来传递图像。目前,该 API 设置为允许匿名,并且 JWT 令牌作为查询参数传递。这很好用。

[AllowAnonymous]
[HttpGet("OgiImage/id:guid")]
public IActionResult GetImage(Guid id, string token = null)

...

我正在寻找一种可以重复使用的更优雅的解决方案。我想使用自定义中间件从查询参数 before 设置请求的授权标头,它击中 Jwt 中间件,以便内置身份验证接管。我该怎么做?

【问题讨论】:

【参考方案1】:

这是我想出的解决方案。像魅力一样工作。

我创建了一个自定义属性来选择端点加入此功能并可选择指定参数名称。

[JwtParameter("token)]
[HttpGet("OgiImage/id:guid")]
public IActionResult GetImage(Guid id, string token = null)

...

然后是中间件本身。

public class TokenQueryParameterMiddleware
    
        private readonly RequestDelegate _next;

        public TokenQueryParameterMiddleware(RequestDelegate next)
        
            _next = next;
        

        public async Task Invoke(HttpContext httpContext)
        
            try
            
                //if has request header, do nothing
                if (httpContext.Request.Headers.TryGetValue("Authorization", out var authHeader) && authHeader.Any() &&
                    authHeader[0].StartsWith("Bearer", StringComparison.OrdinalIgnoreCase))
                
                    return;
                

                var endpoint = httpContext.GetEndpoint();
                var attribute = endpoint.Metadata.OfType<JwtParameterAttribute>().FirstOrDefault();
                if (attribute != null && httpContext.Request.Query.TryGetValue(attribute.Parameter, out var param))
                
                    var token = param.FirstOrDefault();
                    if (!string.IsNullOrWhiteSpace(token))
                    
                        httpContext.Request.Headers.Add("Authorization", $"Bearer token");
                    
                
            
            finally
            
                // Call the next middleware delegate in the pipeline 
                await _next.Invoke(httpContext);
            
        
    

中间件配置在授权和身份验证核心之前。

app.UseMiddleware<TokenQueryParameterMiddleware>();

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

【讨论】:

以上是关于在 ASP.Net Core 3 中从中间件设置 HTTP 身份验证标头的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core 中间件中直接将响应正文设置为文件流?

如何在 asp.net core v 2.0 中从 javascript 调用 PageModel 方法

在 Asp.Net Core 应用程序中从 TypeScript 引用 node_modules

在 asp.net core 5 MVC 视图中从 C# 代码调用 JavaScript 函数

在 asp.net core 3.1+ 中使用多个中间件进行身份验证和授权

写入自定义 ASP.NET Core 中间件