无法运行.net core 2.2 api应用程序:未指定authenticationScheme,并且未找到DefaultChallengeScheme

问题描述 投票:0回答:1

我们正在将Azure Active Directory与React Web应用程序集成,后端将是.net core 2.2 API。

当前状态:我们可以将React Web应用程序的应用程序注册添加到Azure AD中。有了这个,我们就能够在反应Web应用程序上成功验证后进行身份验证并获取Bearer令牌。

我面临的挑战:自认证完成以来,我想使用Bearer令牌在Backend .net核心API上执行授权。但是,由于我不断收到以下错误,我无法获得成功。

InvalidOperationException:未指定authenticationScheme,并且未找到DefaultChallengeScheme。任何人都可以帮忙解决这个问题吗?

来自.net core api项目的代码片段:

在启动文件中:ConfigureServices(IServiceCollection services)方法。

              services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

      services.AddAuthorization(options =>
        {
            options.AddPolicy("RequireAdministratorRole",
                policy =>
                {
                    policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme);
                    policy.AddRequirements(new AdminRequirement());
                    policy.RequireAuthenticatedUser();
                    policy.RequireRole("Admin");

                });
        });

  services.AddSingleton<IAuthorizationHandler, AdminHandler>();

在Configure(IApplicationBuilder应用程序,IHostingEnvironment环境)中:

            if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseAuthentication();
        app.UseMvc();

和AuthenticationHandler:

    public class AdminHandler : AuthorizationHandler<AdminRequirement>, IAuthorizationRequirement
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AdminRequirement requirement)
    {
        //Check user claims for Role
        if (context.User.HasClaim(ClaimTypes.Role, "Admin"))
        {
            context.Succeed(requirement);
        }

        return Task.FromResult(0);
    }
}
.net-core azure-active-directory bearer-token role-base-authorization
1个回答
0
投票

如果您需要指定架构,可能由于不同类型的身份验证,您应该在Configure()方法中添加以下代码:

 app.Use(async (context, next) =>
        {
            IEnumerable<string> schemes = GetSchemesForRequest(context);
            foreach (string scheme in schemes)
            {
                AuthenticateResult result = await context.AuthenticateAsync(scheme);
                if (!result.Succeeded)
                    continue;

                context.User = result.Principal;
                break;
            }
            await next();
        });

然后在你的方法中:

IEnumerable<string> GetSchemesForRequest(HttpContext context)

您可以认为该请求的正确方案是什么。

© www.soinside.com 2019 - 2024. All rights reserved.