В моем контроллере API я хочу, чтобы атрибут [Authorize]
возвращал 401 Несанкционированный вместо принудительного вызова Azure AD B2 C входа и возвращал этот ответ моему внешнему интерфейсу (совершая вызовы ajax). в API).
Перенаправление вызова не работает из-за политики Azure CORS. Я нашел несколько ответов, ни один из которых, похоже, не работает (401 не возвращается, он все еще пытается перенаправить на вызов Azure B2 C).
Контроллер API:
[Route("api/[controller]")]
[ApiController]
[Authorize]
public class HierarchyController : ControllerBase
// ...
Вот мой текущий Startup.ConfigureServices
код:
// ...
services.Configure<AzureADB2COptions>(opt =>
Configuration.GetSection("AzureAdB2C").Bind(opt));
services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
.AddAzureADB2C(opt => Configuration.Bind("AzureAdB2C", opt))
.AddCookie(opt =>
{
opt.Events = new CookieAuthenticationEvents
{
OnRedirectToLogin = ctx =>
{
ctx.Response.StatusCode = 401;
return Task.CompletedTask;
}
};
});
Я также пытался использовать:
services.ConfigureApplicationCookie(options =>
{
options.Events.OnRedirectToLogin = context =>
{
context.Response.Headers["Location"] = context.RedirectUri;
context.Response.StatusCode = 401;
return Task.CompletedTask;
};
});
И в обоих случаях переключение OnRedirectToLogin
с OnRedirectToAccessDenied
. Ни одна из этих работ. Точки останова внутри этих событий никогда не достигаются, и после выполнения неавторизованного вызова API я получаю эту ошибку:
Access to XMLHttpRequest at <MY_B2C_ADDR> (redirected from 'https://localhost:44394/api/Hierarchy') from origin 'https://localhost:44394' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Edit: ConfigureServices
// ...
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller}/{action=Index}/{id?}");
});