【问题标题】:Setting HTTP Authentication header from middleware in ASP.Net Core 3在 ASP.Net Core 3 中从中间件设置 HTTP 身份验证标头
【发布时间】: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 中间件,以便内置身份验证接管。我该怎么做?

【问题讨论】:

    标签: c# asp.net-core authentication jwt authorization


    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2011-09-11
      • 2018-01-30
      • 1970-01-01
      • 2021-04-20
      • 2018-07-06
      • 2018-01-28
      • 2013-05-31
      • 2016-03-03
      相关资源
      最近更新 更多