【问题标题】:How to use custom filter in Minimal Api .net 6.0?如何在 Minimal Api .net 6.0 中使用自定义过滤器?
【发布时间】:2022-08-05 22:11:01
【问题描述】:

解码在另一个应用程序中生成的令牌后,我需要检查是否过期。我在 Web 应用程序中使用了 OnActionExecuting,但在最小的 api 中没有使用此方法。

现在我通过检查响应来捕捉它,但我需要一个比这更好的解决方案。

程序.cs

builder.Services.AddSingleton(autoMapper);
builder.Services.AddAuthorization();
builder.Services.AddAuthentication(\"BearerAuthentication\").AddScheme<Microsoft.AspNetCore.Authentication.AuthenticationSchemeOptions, BearerAuthendicationHandler>(\"BearerAuthentication\", null);
var app = builder.Build();
app.UseAuthorization();
app.UseAuthentication();

app.MapGet(\"/countries\", async (HttpContext http, CountryService service) =>
 {
     if (http.Response.StatusCode == 401) return Results.Unauthorized();    
      var result = service.GetAll(http.Request.Headers[\"lang\"]);
     return Results.Ok(result);
 });

BearerAuthendicationHandler.cs

public class BearerAuthendicationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
    public BearerAuthendicationHandler(
        Microsoft.Extensions.Options.IOptionsMonitor<AuthenticationSchemeOptions> options,
        ILoggerFactory logger,
        System.Text.Encodings.Web.UrlEncoder encoder,
        ISystemClock clock
        ) : base(options, logger, encoder, clock)
    {
    }

    protected override Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        var authHeader = Request.Headers[\"Authorization\"].ToString();
        try
        {
            if (authHeader != null && authHeader.StartsWith(\"bearer\", StringComparison.OrdinalIgnoreCase))
            {
                var token = authHeader.Substring(\"Bearer \".Length).Trim();
                string secret = \"secret_key\";
                var key = Encoding.ASCII.GetBytes(secret);
                var handler = new JwtSecurityTokenHandler();
                var validations = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(key),
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
                var claims = handler.ValidateToken(token, validations, out var tokenSecure);
                var exp = claims.Claims.FirstOrDefault(s => s.Type == \"exp\").Value;
                var timeStamp = long.Parse(exp);
                var timeStampNow = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds();
                if (timeStamp < timeStampNow)
                {
                    Response.StatusCode = 401;
                    return Task.FromResult(AuthenticateResult.Fail(\"Invalid Authorization Header\"));
                }

                Response.StatusCode = 200;
                return Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket(new ClaimsPrincipal(), null, \"\")));
            }
            else
            {
                Response.StatusCode = 401;
                return Task.FromResult(AuthenticateResult.Fail(\"Invalid Authorization Header\"));
            }
        }
        catch (Exception ex)
        {
            Response.StatusCode = 401;
            return Task.FromResult(AuthenticateResult.Fail(\"Invalid Authorization Header\"));
        }
    }
}

谢谢你的帮助。

  • 您可以尝试创建自定义中间件来验证令牌。在自定义中间件中,它检查每个请求,如果此请求处理程序的令牌已过期,它不关心此令牌是从哪里生成的。您可以参考helpful article 的代码示例。

标签: c# asp.net-core-6.0 minimal-apis


【解决方案1】:

这将在 .Net 7 (.AddFilter<T>) 中可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    相关资源
    最近更新 更多