MVC6 中的 IAuthenticationFilter 等价物

IAuthenticationFilter equivalent in MVC6

我正在将 Web Api 2 项目移动到 MVC 6,因为 Microsoft 正在合并 ASP.NET 5 中的两个 API。在我的 WebApi 项目中,我有一个自定义属性过滤器 class 将使用 public 密钥、私钥和 HMAC 身份验证的组合来验证、授权和防止交易重放(基本上,doing this 有一些调整以适应我的项目)。

现在在 MVC6 中,据我所知,我必须停止使用 Microsoft.Web.Http 命名空间中的任何内容,而是使用 Microsoft.AspNet.Mvc。所以我已经这样做了,但是 Microsoft.AspNet.Mvc.Filters 似乎没有任何等效于 Web Api 2 的 IAuthenticationFilter.

这对我来说是个问题,因为我的客户 AuthenticationFilter 实现了所有 IAuthenticationFilter,其中包含所有逻辑。更重要的是,它使用 Context 临时存储帐户的 public 密钥,因此我的控制器可以访问它以依次加载帐户。

所以我的问题是,在 MVC6 中过滤请求的正确方法是什么,使用类似于身份验证过滤器的 class 来拦截请求和 return 适当的状态代码?我找不到任何专门介绍这些细节的文章(它们都倾向于涵盖 MVC5)。

我知道这是一个较老的问题,但希望有人(甚至你自己)能从答案中找到价值。

MVC6 实际上有一个替代方案。你有一个

public abstract class AuthorizationFilterAttribute :
    Attribute, IAsyncAuthorizationFilter, IAuthorizationFilter, IOrderedFilter

这基本上告诉你,你可以创建你的自定义 class,从中派生它(所有这些接口的命名空间,顺便说一句,是 Microsoft.AspNet.Mvc.Filters,应该就是这样。你可以用它装饰动作,或者你可以在 Startup.cs 中这样做,以应用于 all 动作:

 public void ConfigureServices(IServiceCollection services)
    {
        // Add MVC services to the services container.
        services.AddMvc(options =>
        {
            // add an instance of the filter, like we used to do it
            options.Filters.Add(new MySpecialFilter());
        });

        services.AddTransient<LogFilter>();
    }

如果你想在通过 DI 实例化的过滤器中使用更多的逻辑(例如我上面的 LogFilter),你需要使用 Service Filters or Type Filters

您现在可以在 Startup.cs 文件中使用 [ServiceFilter(typeof(LogFilter))] 或使用 o.Filters.Add(new ServiceFilterAttribute(typeof(LogFilter))); 修饰动作。但请记住,要做到这一点,您需要向 DI 容器注册类型,就像我在上面的 .AddTransient<>() 调用中所做的那样。

IAuthenticationFilter 不再存在,IAuthorizationFilter 根本不会在 MVC 6 中取代它

原因:认证不等于授权。

因此,IMO 身份验证过滤器应该保持可用!