【问题标题】:AspnetCore 2.1 custom Authorisation filter issueAspnetCore 2.1 自定义授权过滤器问题
【发布时间】:2018-11-15 10:42:31
【问题描述】:

我有一个 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:适合类型的构造函数 授权过滤器;无法定位。确保类型是具体的 并为公共的所有参数注册服务 构造函数。

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

services.AddScoped<IAuthorizationFilter, AuthorisationFilter>();

但是没有区别

【问题讨论】:

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


    【解决方案1】:

    内置的DI对当前的HttpContext一无所知,首先你必须将IHttpContextAccessor添加到服务集合中:

    services.AddHttpContextAccessor();
    

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

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

    然后就可以通过_httpContextAccessor.HttpContext访问当前的HttpContext了。

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

    context.HttpContext
    

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

    public AuthorisationFilter(Claim claim)
    {
    }
    

    【讨论】:

    • 我已经尝试过了,但我仍然收到完全相同的错误。我尝试在 authorisationFilter 构造函数上一起删除输入参数,现在有效地使它成为一个空构造函数,只是为了看看它是否在那里,这仍然给出了同样的错误
    • 更新了我的答案,我没注意到你正在设置Argument sry 的Argument 属性
    • 谢谢....我还有其他问题,但我现在触发了 onAuthorization 方法。所以我会尝试处理其他提出新帖子的人。
    猜你喜欢
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 2017-10-26
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多