如何覆盖控制器内部Startup类中定义的“ OnActionExecuting”?

时间:2019-05-29 15:42:14

标签: asp.net-core onactionexecuting

此代码针对每个传入请求运行,以检查其是否包含有效的JWT令牌。

services.AddMvc(options => 
       options.Filters.Add(typeof(JwtAttribute)));

在大多数情况下,这是我想要的,但第一次(用户尝试登录时)除外。因为它在每次请求时都在运行,所以用户无法登录。

我尝试在登录操作的顶部添加一个属性,但是仍然无法正常工作。

[HttpPost]
[AllowAnonymous]
public async Task<JsonResult> Login([FromBody]Credentials formData)
{

}

在这种情况下,我该怎么做才能覆盖启动类中的 OnActionExecuting ,以便用户可以登录。

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

通过使用自定义过滤器,而不是内置的身份验证和授权系统,您将无法在此处使用[AllowAnonymous],因为它直接链接到auth框架。

您可以做的是添加其他元数据,然后将其作为JwtAttribute过滤器的一部分进行检查。例如,创建另一个属性,如下所示:

public class DisableJwtAttribute : Attribute, IFilterMetadata
{ }

您现在可以使用[DisableJwt]将此属性添加到控制器操作中。

现在,在JwtAttribute过滤器内部,您可以检查该过滤器是否存在以停止处理请求。例如。如果您的过滤器是授权过滤器,则应如下所示:

public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
    if (context.Filters.Any(item => item is DisableJwtAttribute))
        return;

    // filter is active
}

话虽这么说,更好的解决方案是采用身份验证系统,并使您的JWT验证成为常规身份验证过程的一部分。这样,您实际上可以从ASP.NET Core中的所有身份验证和授权中受益。