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 身份验证过滤器应该保持可用!
我正在将 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 身份验证过滤器应该保持可用!