Не удалось разрешить службу для типа «Microsoft.Identity.Web.ITokenAcquisition» при попытке активировать граф API - PullRequest
0 голосов
/ 12 января 2020

net основной 2.2 проект. Я реализую авторизацию на основе групп для моего API. Я следовал https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/tree/886f2ad2bf6add922c7998fb592e3d4088f9cf4e/5-WebApp-AuthZ/5-2-Groups, чтобы реализовать это. Сначала я добавил https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/tree/886f2ad2bf6add922c7998fb592e3d4088f9cf4e/Microsoft.Identity.Web в свой проект. Затем я начал добавлять политику в мой файл startup.cs, как показано ниже.

services.AddAuthorization(options =>
            {
                options.AddPolicy("GroupsCheck", policy =>
                    policy.Requirements.Add(new GroupsCheckRequirement("2a39995a-8fd1-410e-99e2-11cf6046090d")));
            });

            services.AddScoped<IAuthorizationHandler, GroupsCheckHandler>();

Затем я добавил GroupsCheckHandler.cs

public class GroupsCheckHandler : AuthorizationHandler<GroupsCheckRequirement>
    {
        private readonly ITokenAcquisition tokenAcquisition;
        private readonly IMSGraphService graphService;

        public GroupsCheckHandler(ITokenAcquisition tokenAcquisition, IMSGraphService MSGraphService)
        {
            this.tokenAcquisition = tokenAcquisition;
            this.graphService = MSGraphService;
        }
        protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                  GroupsCheckRequirement requirement)
        {
            string accessToken = await tokenAcquisition.GetAccessTokenOnBehalfOfUserAsync(new[] { Constants.ScopeUserRead, Constants.ScopeDirectoryReadAll });

            User me = await graphService.GetMeAsync(accessToken);

            IList<Group> groups = await graphService.GetMyMemberOfGroupsAsync(accessToken);

            var result = false;
            foreach (var group in groups)
            {
                if (requirement.groups.Equals(group.Id))
                {
                    result = true;
                }
            }

            if (result)
            {
                context.Succeed(requirement);
            }

        }
    }

Затем я добавил атрибут авторизации в api, как показано ниже.

[Authorize(Policy = "GroupsCheck")]
[Route("api/[controller]")]
[ApiController]

Теперь, когда я пытаюсь получить доступ к любому API, я получаю исключение ниже.

System.InvalidOperationException: Unable to resolve service for type 'Microsoft.Identity.Web.ITokenAcquisition' while attempting to activate 'LocationServicesAPI.Services.GroupsRequirements.GroupsCheckHandler'.

Может ли кто-нибудь помочь мне выяснить, что может быть причиной root этой проблемы или Если Я сделал это неправильно или какие-либо конфигурации отсутствуют, может кто-то помочь мне в этом отношении. Любая помощь будет принята с благодарностью. Спасибо

1 Ответ

0 голосов
/ 12 января 2020

Можете ли вы попробовать импортировать?

using ITokenAcquisition = FrameworkCore.Web.AzureIdentity.Client.ITokenAcquisition;
...