有条件地仅在具有授权属性的端点上使用中间件

时间:2019-06-28 17:55:30

标签: c# asp.net-core middleware asp.net-core-identity

我编写了一个只希望在Authenticated端点上运行的中间件。

因此,基本上,我希望它在我的实现中仅在控制器或动作标记为[Authorize]时触发。任何不需要授权的控制器操作都不需要我的中间件来触发。

我发现了UseWhen功能,但是我管理的最好的事情是,中间件仅在用户通过身份验证后才触发。但是,在用户登录后,if仍然会在所有端点上触发。

这是我目前的条件。

app.UseWhen(context => context.User.Identity.IsAuthenticated, appBuilder =>
{
    appBuilder.UseAutomaticallyRefreshTokenMiddleware();
});

我认为我只需要更改上下文检查,但不能完全确定用什么替换它。

3 个答案:

答案 0 :(得分:2)

根据条件将中间件注册到管道,并且仅在启动时进行注册。此后注册不会被修改。一旦它们成为管道的一部分,它们便成为管道的一部分。您可以做的一件事是自定义Authorize属性。继承Authorize属性,然后在内部运行您在中间件中运行的逻辑。

答案 1 :(得分:0)

ASP.NET Core 3.0通过端点路由启用了此功能,这在此之前无法完成,因为路由决策和端点选择发生的时间比中间件管道运行的时间晚得多。

答案 2 :(得分:0)

根据您的要求,您可以尝试IActionFilter代替中间件。

  1. TokenRefrehFilter

    public class TokenRefrehFilter : IActionFilter
    {
        public void OnActionExecuted(ActionExecutedContext context)
        {
        }
    
        public void OnActionExecuting(ActionExecutingContext context)
        {
            //check whether action is authorized attribute
            var isAuthorizedAction = context.Filters.Any(f => f.GetType() == typeof(AuthorizeFilter));
        }
    }
    
  2. 注册TokenRefrehFilter

    services.AddMvc(options => {
        options.Filters.Add(typeof(TokenRefrehFilter));
    })
    SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    

    通过这种方式,TokenRefrehFilter将针对控制器请求运行,并且您可以将isAuthorizedActionTrue进行检查,以了解需要刷新令牌的操作。