ArgumentNullException при вызове интерфейса из класса - PullRequest
1 голос
/ 07 марта 2020

Я пытаюсь настроить авторизацию с помощью политик, потому что по какой-то причине ClaimsPrinciple не работает, поэтому я пытаюсь это сделать.

Моя текущая проблема заключается в том, что service возвращается как ноль , Я пробовал UserManager<IdentityUser> UserManager = new UserManager<IdentityUser>();, но выдает ошибку.

public class AdminRequirementHandler : AuthorizationHandler<AdminRequirement>
{
    public bool Check = false;
    IServiceProvider service { get; set; }
    protected override async Task HandleRequirementAsync(
                                      AuthorizationHandlerContext context, 
                                      AdminRequirement requirement)
    {
        var CurrentEmail = context.User.Identity.Name;
        string RoleName = requirement.ToString();
        await GetData(CurrentEmail, RoleName);
    }

    private async Task GetData(string CurrentEmail, string RoleName)
    {
        var UserManager = service.GetRequiredService<UserManager<IdentityUser>>();
        var user = await UserManager.FindByNameAsync(CurrentEmail);
        if (user != null)
        {
            var adminCheck = await UserManager.IsInRoleAsync(user, RoleName);
            if (adminCheck == true)
            {
                Check = true;
            }
            else
            {
                return;
            }
        }
    }
}

Есть идеи, как это исправить?

Ответы [ 3 ]

0 голосов
/ 07 марта 2020

Вы можете попробовать использовать внедрение зависимостей в. Net Базовый проект. Больше информации вы можете найти здесь .

0 голосов
/ 07 марта 2020

AuthorizationHandlerContext.Resource должен иметь тип AuthorizationFilterContext. От которого вы можете получить HttpContext и от этого RequestServices, который является ServiceProvider.

0 голосов
/ 07 марта 2020

Сервисное свойство не было инициализировано. Вы можете сделать это, создав конструктор, который принимает параметр IServiceProvider.

public AdminRequirementHandler(IServiceProvider serviceProvider)
{
    service = serviceProvider;
}
...