我们正在将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);
}
}
如果您需要指定架构,可能由于不同类型的身份验证,您应该在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)
您可以认为该请求的正确方案是什么。