В ASP.Net Core 3.0 Preview 7 я попытался написать следующий код:
public void Configure(IApplicationBuilder app) {
app.MapWhen(context =>
context.Request.Path.StartsWithSegments(
new PathString("/UnsecureLog")),
a => {
a.UseRouting();
a.UseEndpoints(endpoints => {
endpoints.MapControllers();
});
}
);
app.UseAuthentication();
app.UseAuthorization();
app.MapWhen(context =>
context.Request.Path.StartsWithSegments(
new PathString("/SecureLog")),
a => {
a.UseRouting();
a.UseEndpoints(endpoints => {
endpoints.MapControllers()
.RequireAuthorization("MustBeReader");
});
}
);
}
Моя цель состояла в том, чтобы разрешить обработку определенных контроллеров в промежуточном программном обеспечении без аутентификации, и я думал, что MapWhen () - это способ осуществить это.
Вместо этого я вижу эту ошибку при попадании в конечную точку /UnsecureLog
:
System.InvalidOperationException: Endpoint ... contains authorization metadata,
but a middleware was not found that supports authorization.
Configure your application startup by adding app.UseAuthorization()
inside the call to Configure(..) in the application startup code.
Перевод: Как насчет того, чтобы реализовать функции безопасности для той конечной точки, которую вы не хотели защищать.
Мой вывод состоит в том, что любой вызов RequireAuthorization("MustBeReader")
в любой логике контроллера обработки блока MapWhen () будет фактически применяться ко всем маршрутам контроллера MVC.
Мой текущий обходной путь - удалить вызов .RequireAuthorization("MustBeReader")
во втором блоке кода MapWhen () и повторно применить его как атрибут ([RequireAuthorization("MustBeReader")]
) к тем конечным точкам, которые я хочу защитить. Это работает без ошибок и обеспечивает желаемое поведение.
Но цель была не в этом, не так ли?
Я бы предпочел управлять целыми группами контроллеров с аналогичными политиками, избавляя других от безопасности вообще, и обрабатывать все это из Configure (). Вместо этого я должен применять желаемые требования авторизации к каждому контроллеру по частям.
Я надеюсь, что есть лучший способ реализовать маршрутизацию, позволяющий избежать отмеченной здесь проблемы. Может я что-то не так делаю.
Мысли, кто-нибудь?
.WithMetadata(new AllowAnonymousAttribute())
- угадайте, что? Ни к одному из них не применяется безопасность. Даже если у другого было множество политик, применяемых повсюду. - person Wellspring   schedule 11.03.2020