在MVC6中的IAuthenticationFilter等价物

时间:2015-07-27 08:37:12

标签: asp.net-web-api2 asp.net-core-mvc

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

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

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

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

2 个答案:

答案 0 :(得分:4)

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

MVC6确实有另一种选择。你有一个

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

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

 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>();
    }

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

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

答案 1 :(得分:0)

IAuthenticationFilter已不复存在,IAuthorizationFilter根本不会在MVC 6中替换它

原因:身份验证不等于授权。

因此IMO认证过滤器应保持可用!