Получение ошибки с фильтром действий ядра 2.1 из-за отсутствия подходящего конструктора - PullRequest
0 голосов
/ 16 мая 2018

Я сделал фильтр заявок

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: подходящий конструктор для типа & # x27; Foosball.Logic.ClaimRequirementFilter & # x27; не может быть найден. Убедитесь, что тип конкретный, а службы зарегистрированы для всех параметров публичного конструктора

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

1 Ответ

0 голосов
/ 16 мая 2018

Поскольку ваш код имеет

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

, вам необходимо добавить следующий конструктор:

public ClaimRequirementFilter(Claim claim)
{

}

Это потому, что внутренняя логика разрешения конструктора использует TypeFilterAttribute.Argument свойство, чтобы решить, какой конструктор использовать для создания экземпляров.

...