【问题标题】:Getting error with aspnet core 2.1 action filter due to missing suitable constructor由于缺少合适的构造函数,aspnet core 2.1 动作过滤器出错
【发布时间】:2018-10-26 21:29:58
【问题描述】:

我已经做了一个索赔过滤器

public class ClaimRequirementAttribute : TypeFilterAttribute
{
    public ClaimRequirementAttribute(string claimType, ClaimRoles claimValue) : base(typeof(ClaimRequirementFilter))
    {
        Arguments = new object[] {new Claim(claimType, claimValue.ToString()) };
    }
}

public class ClaimRequirementFilter : IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var headers = context.HttpContext.Request.Headers;

        var tokenSuccess = headers.TryGetValue("Token", out var token);

        var emailSuccess = headers.TryGetValue("Email", out var email);

        var deviceNameSuccess = headers.TryGetValue("DeviceName", out var deviceName);

        if (tokenSuccess && emailSuccess && deviceNameSuccess)
        {
            var accountLogic = context.HttpContext.RequestServices.GetService<IAccountLogic>();

            var hasClaim = accountLogic.ValidateLogin(email, token, deviceName).Result.Success;

            if (!hasClaim)
            {
                context.HttpContext.ForbidAsync();
            }
        }
        else
        {
            context.HttpContext.ForbidAsync();
        }
    }

}

我已经在我的启动中注册了过滤器

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<ConnectionStringsSettings>(Configuration.GetSection("ConnectionStrings"));
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        services.AddScoped<ClaimRequirementFilter>();

但是当我导航到使用过滤器的操作时出现此错误

[HttpPost]
[ClaimRequirement("Permission", ClaimRoles.Admin)]
public async Task ResetLeaderboard()

InvalidOperationException:找不到适合“Foosball.Logic.ClaimRequirementFilter”类型的构造函数。确保类型是具体的,并且为公共构造函数的所有参数注册了服务

github:https://github.com/Mech0z/Foosball/tree/core2.1/Foosball

【问题讨论】:

  • 您需要在问题正文中包含您的代码。如果外部链接中断/被删除,则无济于事。
  • @maccettura 完成
  • 您是否考虑过使用基于策略的授权并利用现有的[Authorize] 属性? docs.microsoft.com/en-us/aspnet/core/security/authorization/…
  • @Brad 上次让任何类型的内置身份验证与 Mongodb 数据库一起工作似乎很麻烦,并且为我更新到 aspnet 核心 2.0 和转发的 nuget 包很少见。所以现在我只是为这个小足球应用程序做了一些简单的安全性(可能非常不安全),但我可能会在未来看看它:) 但它比我们之前没有安全性要好

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


【解决方案1】:

因为你的代码有

Arguments = new object[] {new Claim(claimType, claimValue.ToString()) };

你需要添加以下构造函数:

public ClaimRequirementFilter(Claim claim)
{

}

这是因为internal constructor resolving logic 使用TypeFilterAttribute.Argument 属性来决定使用哪个构造函数进行实例化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2022-06-29
    • 2019-04-02
    • 1970-01-01
    • 2019-01-07
    • 2013-11-30
    • 2019-08-29
    相关资源
    最近更新 更多