.NET Core:用于控制器身份验证的自定义承载过滤器

.NET Core : custom bearer filter for controller authentication

我是新手,想在控制器上进行简单的承载身份验证。所以我扩展了 Startup.cs:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    //...
    app.UseAuthorization();
    app.UseAuthentication();
}

并创建了过滤器:

public class BearerAuthenticationFilter : ActionFilterAttribute, IAuthenticationFilter
{
    private readonly string _bearerToken = ConfigurationManager.AppSettings["Token"];
    public bool AllowMultiple { get; }

    public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
    {
        //...
    }

    public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
    {
        //...
    }
}

public class AuthenticationFailureResult : IHttpActionResult
{
    //...     
}

但是控制器忽略了来自过滤器的代码。

我做错了什么?我找不到任何关于如何实现不记名身份验证的好的简单教程...

控制器:

[ApiController]
[BearerAuthenticationFilter]
[Route("api/Test")]
public class TestController : ControllerBase
{
   //...
}

编辑: 我实施了@Tony Houdek 的更改,但在我 运行 控制器之后它仍然不执行任何操作。我也无法在 BearerAuthenticationFilter.

中启动调试器

我的猜测是你没有全局注册过滤器,所以它不会自动应用于所有控制器操作,你可以在注册控制器时全局注册它,例如这样:

services.AddMvc(options =>
{
    options.Filters.Add(new BearerAuthenticationFilter());
});

或者您可以使用 BearerAuthenticationFilter 属性为特定 controllers/actions 显式应用过滤器(不要忘记从过滤器 class 中的属性 class 派生):

[BearerAuthenticationFilter]
[ApiController]
[Route("api/Test")]
public class TestController : ControllerBase
{
    //...
}

您可以在此处阅读有关操作过滤器的更多信息:https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions-1/controllers-and-routing/understanding-action-filters-cs