Я создаю приложение в ASP.NET Core 2.2. В файле Startup.cs уже был маршрут по умолчанию, и я определил еще один маршрут для админки:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "admin",
template: "{area=Admin}/{controller=User}/{action=Index}/{id?}");
});
Область администратора авторизована ролью Admin
с использованием [Authorize(Roles = "Admin")]
. Но когда я запускаю приложение, оно по умолчанию вызывает этот маршрут, хотя пользователь ничего не видит и получает неавторизованную страницу. Почему приложение использует маршрут области в качестве маршрута по умолчанию?
Говоря {area=Admin}
, вы делаете часть area
необязательной. Таким образом, маршрут, не содержащий области, также будет сопоставлен с ней (с выбранной областью Admin
).
Если вы хотите убедиться, что только путь /Admin/
вызывает вашу область, вы можете сделать это следующим образом:
routes.MapRoute(
name: "admin",
template: "Admin/{controller=User}/{action=Index}/{id?}",
defaults: new { area = "Admin" });
Вы также можете использовать этот метод быстрого доступа, который также устанавливает ограничение маршрута для вашей области:
routes.MapAreaRoute("admin", "Admin",
"Admin/{controller=User}/{action=Index}/{id?}");
Кроме того, порядок, в котором вы регистрируете свои маршруты, также важен. Как правило, будет использоваться первый шаблон маршрута, соответствующий маршруту. Поэтому, поскольку ваш административный маршрут довольно специфичен, вам, вероятно, следует сначала указать его, а только затем вернуться к маршруту по умолчанию.
Как документация по областям маршрутизации в MVC объясняет:
Conventional routing is order-dependent. In general, routes with areas should be placed earlier in the route table as they’re more specific than routes without an area.