Как реализовать условный AutomaticChallenge в ASP.NET Core?

Как перенаправить запросы, поступающие на какой-либо путь (веб-сайт), на страницу входа, но отвечать на запросы неавторизованными запросами, приходящими на другой путь (пути API)? Как я понимаю, AutomaticChallenge меняет это поведение для всех веб-приложений. Но как сделать это условным?

Я использую OpenIddict, который является библиотекой конфигурации OpenId Connect Server. И вообще, клиенты - это мобильные приложения. Однако было бы неплохо иметь поведение, похожее на веб-сайт, для некоторых контроллеров, которые возвращают представления.

Код запуска выглядит так:

        // Add a middleware used to validate access
        // tokens and protect the API endpoints.
        app.UseOAuthValidation();

        app.UseCsp(options => options.DefaultSources(directive => directive.Self())
            .ImageSources(directive => directive.Self()
                .CustomSources("*"))
            .ScriptSources(directive => directive.Self()
                .UnsafeInline())
            .StyleSources(directive => directive.Self()
                .UnsafeInline()));

        app.UseXContentTypeOptions();

        app.UseXfo(options => options.Deny());

        app.UseXXssProtection(options => options.EnabledWithBlockMode());

        app.UseIdentity();

        // Add external authentication middleware below. To configure them please see http://go.microsoft.com/fwlink/?LinkID=532715
        app.UseTwitterAuthentication(...);

        app.UseFacebookAuthentication(...);

        app.UseGoogleAuthentication(...);

        app.UseSession();

        app.UseOpenIddict();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

        app.UseSwagger();
        app.UseSwaggerUi();

1 ответ

Изменить AutomaticChallenge ты можешь использовать MapWhen или используйте при:

// ...
app.MapWhen(ctx => ctx.Request.Path.Value.StartsWith("/api"), builder =>
{
      builder.UseCookieAuthentication(new CookieAuthenticationOptions()
      {
            AutomaticChallenge = false,
      });
      // ...
});
app.MapWhen(ctx => !ctx.Request.Path.Value.StartsWith("/api"), builder =>
{
      builder.UseCookieAuthentication(new CookieAuthenticationOptions()
      {
            AutomaticChallenge = true,
      });
      // ...
});

Но я думаю, что ваше требование не о AutomaticChallenge, Если запрос ajax, то CookieAuthentication промежуточное ПО отвечает 401, иначе перенаправляет на путь входа в систему. Так что вам не нужно условное промежуточное ПО.