AspnetCore 2.1自定义授权过滤器问题

时间:2018-11-15 10:42:31

标签: c# asp.net-mvc asp.net-web-api .net-core

我有一个Asp.net core 2 Web API。并且我正在尝试实现自定义授权过滤器。

目前,我有以下内容:

 public class AuthorisationAttribute : TypeFilterAttribute
{
    public AuthorisationAttribute() : base(typeof(AuthorisationFilter))
    {
        Arguments = new object[] { new Claim(ClaimTypes.UserData, "will be my user data") };
    }
}
 public class AuthorisationFilter : IAuthorizationFilter
{
    readonly HttpContext _httpContext;
    public AuthorisationFilter(HttpContext httpContext)
    {
        _httpContext = httpContext;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var authorisationCookie = context.HttpContext.Request.Headers.Where(t => t.Key == "auth").FirstOrDefault();

        var temp = new JwtSecurityTokenHandler();
        var unencryptedToken = temp.ReadToken(authorisationCookie.Value) as JwtSecurityToken;

        var session = _httpContext.Session;
        //MORE TO DO HERE YET! Just want to test getting called when expected. 
        return;
    }
}

然后使用我拥有的控制器方法:

 public class HomeController : Controller
{
    [Authorisation(),HttpGet]
    public IActionResult Index()
    {
          return View("~/Views/Home/Index.cshtml");
    }
}

运行应用程序时,将调用authorisationAttribute构造函数。此时,我尝试调用控制器方法,我收到以下错误:

  

InvalidOperationException:适合类型的构造函数   AuthorizationFilter;找不到。确保类型是具体的   并为公众的所有参数注册了服务   构造函数。

所以在我的startup.cs文件中,我还添加了:

services.AddScoped<IAuthorizationFilter, AuthorisationFilter>();

但这没什么作用

1 个答案:

答案 0 :(得分:0)

内置的DI不了解当前的HttpContext,首先您必须将IHttpContextAccessor添加到服务集合中:

services.AddHttpContextAccessor();

然后您可以将其用作过滤器的构造函数参数:

public AuthorisationFilter(IHttpContextAccessor httpContextAccessor)
{
    _httpContextAccessor = httpContextAccessor;
}

然后,您可以通过HttpContext访问当前的_httpContextAccessor.HttpContext

但是,您也可以通过自己的HttpContext访问当前的AuthorizationFilterContext,就像您已经在示例代码中使用的那样:

context.HttpContext

编辑:在设置Argument的{​​{1}}属性时,您必须在使用该参数的过滤器中创建一个构造函数,例如:

TypeFilterAttribute