Как реализовать условный 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, иначе перенаправляет на путь входа в систему. Так что вам не нужно условное промежуточное ПО.