ASP. NET Core 3.1, как вернуть 401 Несанкционированный вместо вызова с Azure AD B2C - PullRequest
0 голосов
/ 20 марта 2020

В моем контроллере 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?}");
});

1 Ответ

0 голосов
/ 20 марта 2020

Для любого (или меня) читающего в будущем - я решил проблему. В ConfigureServices до:

        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = AzureADB2CDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultSignOutScheme = AzureADB2CDefaults.AuthenticationScheme;
        })
            .AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options))
            .AddCookie(options =>
            {
                options.Events = new CookieAuthenticationEvents
                {
                    OnRedirectToLogin = context =>
                    {
                        if (context.Request.Path.StartsWithSegments("/api"))
                        {
                            context.Response.StatusCode = StatusCodes.Status401Unauthorized;
                        }
                        else
                        {
                            context.Response.Redirect(context.RedirectUri);
                        }

                        return Task.FromResult(0);
                    }
                };
            });
...