我有一个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>();
但这没什么作用
答案 0 :(得分:0)
内置的DI不了解当前的HttpContext
,首先您必须将IHttpContextAccessor
添加到服务集合中:
services.AddHttpContextAccessor();
然后您可以将其用作过滤器的构造函数参数:
public AuthorisationFilter(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
然后,您可以通过HttpContext
访问当前的_httpContextAccessor.HttpContext
。
但是,您也可以通过自己的HttpContext
访问当前的AuthorizationFilterContext
,就像您已经在示例代码中使用的那样:
context.HttpContext
编辑:在设置Argument
的{{1}}属性时,您必须在使用该参数的过滤器中创建一个构造函数,例如:
TypeFilterAttribute