Я добавил Area в свой веб-проект, в котором я надеюсь выполнить все необходимые задачи аутентификации. Структура папок в проекте:
- Solution
- Web Project
- Areas
- Accounts
- Controllers
AccountController.cs
В AccountController
есть обычное LogOn(LogOnModel model, string returnUrl)
Действие.
В AccountsAreaRegistration.cs
есть автоматически сгенерированный маршрут:
context.MapRoute(
"Accounts_default",
"Accounts/{controller}/{action}/{id}",
new {
action = "LogOn",
id= UrlParameter.Optional
}
);
Первое, что пришло мне в голову, - это просто добавить имя области к атрибуту loginUrl
в web.config и позволить отображению маршрута позаботиться о перенаправлении - довольно просто, подумал я:
<forms loginUrl="~/Accounts/Account/LogOn"
timeout="2880" />
Единственная проблема в том, что это не работает. Я получаю сообщение об ошибке «невозможно найти» / «Аккаунты / Аккаунт / Вход» - или какое-либо значение, которое я ввел в атрибут loginUrl. Мне кажется, что URL-адрес, указанный в Web.Config, не пропускает это значение таблица маршрутов для поиска совпадения.
* примечание: все это вызывается атрибутом [Authorize] для действия в одном из моих других контроллеров.
EDIT
Обходной путь, который я нашел, - оставить URL-адрес по умолчанию («Учетная запись / вход в систему») и добавить еще один маршрут в global.asax, чтобы перенаправить запрос в нужную область:
routes.MapRoute("LogOn",
"Account/LogOn/{id}",
new { controller = "Account",
action = "LogOn",
id = UrlParameter.Optional}
).DataTokens.Add("area", "Accounts");
Это выполняет работу, но я не знаю, является ли это лучшим решением проблемы.