【问题标题】:Unable to run .net core 2.2 api application :No authenticationScheme was specified, and there was no DefaultChallengeScheme found无法运行 .net core 2.2 api 应用程序:没有指定 authenticationScheme,也没有找到 DefaultChallengeScheme
【发布时间】:2019-08-02 22:55:52
【问题描述】:

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

当前状态:我们可以将 React Web 应用程序的应用程序注册添加到 Azure AD。这样,我们就可以在 React Web 应用成功认证后进行认证并获取 Bearer 令牌。

我面临的挑战:由于已完成身份验证,我想使用 Bearer 令牌在后端 .net 核心 API 上执行 授权。但是,我无法成功,因为我不断收到以下错误。

InvalidOperationException: 没有指定 authenticationScheme,也没有找到 DefaultChallengeScheme。谁能帮忙解决这个问题?

.net core api 项目的代码 sn-p:

在启动文件中: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>();

在配置中(IApplicationBuilder 应用程序,IHostingEnvironment env):

            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】:

    如果您需要指定架构,可能是由于不同类型的身份验证,您应该在 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)
    

    您可以考虑该请求的正确方案是什么。

    【讨论】:

      猜你喜欢
      • 2019-03-22
      • 2019-11-02
      • 1970-01-01
      • 2018-02-26
      • 2021-10-18
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 2021-10-11
      相关资源
      最近更新 更多