尝试激活图形 API 时无法解析类型“Microsoft.Identity.Web.ITokenAcquisition”的服务

Nir*_*jan 2 c# azure azure-active-directory .net-core

net core 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>();
Run Code Online (Sandbox Code Playgroud)

然后我添加了 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);
            }

        }
    }
Run Code Online (Sandbox Code Playgroud)

然后我在 api 中添加了授权属性,如下所示。

[Authorize(Policy = "GroupsCheck")]
[Route("api/[controller]")]
[ApiController]
Run Code Online (Sandbox Code Playgroud)

现在,每当我尝试访问任何 api 时,我都会遇到异常。

System.InvalidOperationException: Unable to resolve service for type 'Microsoft.Identity.Web.ITokenAcquisition' while attempting to activate 'LocationServicesAPI.Services.GroupsRequirements.GroupsCheckHandler'.
Run Code Online (Sandbox Code Playgroud)

有人可以帮我找出这个问题的根本原因,或者如果我做错了或缺少任何配置,有人可以在这方面帮助我。任何帮助将不胜感激。谢谢

Shi*_*nva 6

依赖注入正在尝试实例化 ITokenAcquisition 的实例并失败。这可能是因为 Startup.cs 中的配置存在问题。您需要确保在配置身份验证时调用EnableTokenAcquisitionToCallDownstreamApiAddInMemoryTokenCaches

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
                .EnableTokenAcquisitionToCallDownstreamApi()
                .AddInMemoryTokenCaches();
Run Code Online (Sandbox Code Playgroud)

  • `.EnableTokenAcquisitionToCallDownstreamApi()` 包含在哪个库中?因为我的IDE找不到它。我猜它与“.AddMicrosoftIdentityWebApi”相同,因为我也找不到。我正在使用 .Net 5.0,并且有关如何获取和使用令牌的文档与往常一样非常糟糕。 (2认同)

小智 -4

我在使用 Blazor 时遇到了几乎类似的错误,并通过将 services.AddScoped() 更改为 services.AddHttpClient() 解决了该错误