我有一个ASP MVC 5应用程序,我无法使用自定义身份验证过滤器。
我在文件夹" CustomFilters"中创建了自定义身份验证过滤器。如下图所示:
public class CustomBasicAuthAttribute : ActionFilterAttribute, IAuthenticationFilter
{
public void OnAuthentication(AuthenticationContext context)
{
// does not fire... :(
}
public void OnAuthenticationChallenge(AuthenticationChallengeContext context)
{
// does not fire... :(
}
}
在我的ProductController中,我装饰了以下方法之一:
public class ProductsController : ApiController
{
[CustomBasicAuth]
[HttpGet]
[Route("clients/{id}/products")]
public IEnumerable<Products> GetByClientId(int id)
{
return new List<Products>();
}
但是出于某种原因,CustomBasicAuth类中的OnAuthentication方法永远不会触发。我试图装饰整个控制器,并尝试全局加载它,但没有一个工作。
我阅读并关注了大量关于此的在线文章,看起来这应该可行。
非常感谢任何帮助。
答案 0 :(得分:5)
这里的问题是你正在为你的控制器类型实现错误的IAuthenticationFilter。您的控制器类继承自ApiController,因此这似乎是一个Web API项目。 要为Web API实现自定义身份验证,CustomBasicAuthAttribute需要实现System.Web.Http.Filters.IAuthenticationFilter接口。 其中的方法是AuthenticateAsync和ChallengeAsync。
显示的CustomBasicAuthAttribute实现明显继承自System.Web.Mvc.Filters.IAuthenticationFilter,因为它使用的是OnAuthentication和OnAuthenticationChallenge。放置在标准MVC控制器中的操作时,该属性将正确触发,而不是从APIController继承的属性。
答案 1 :(得分:0)
这也发生在我身上,但在我的情况下,我只用我的自定义基本身份验证属性修饰了我想要保护的控制器方法,但完全忘了用普通的MVC“Authorize”属性进行装饰。您需要仍然具有“Authorize”属性,以便MVC保护方法或类,然后触发您的自定义属性过滤器。