Как сохранить параметр из url после перенаправления на login.aspx

У меня следующий маршрут:

{язык} / {контроллер} .mvc / {действие} / {идентификатор}

После того, как пользователь выбрал язык, он будет поддерживаться на языке значений маршрута.

http://localhost:4000/de/Account.mvc/Register

У меня проблема, если пользователь попадает на страницу, требующую авторизации. Затем он перенаправляется на http://localhost:4000/Account.mvc/Login?ReturnUrl=%2fde%2fAccount.mvc%2fProfileData

Страница входа настроена в web.config и не позволяет использовать параметр из маршрута. Страница после входа в систему в порядке (http://localhost:4000/de/Account.mvc/ProfileData), но сама страница входа не имеет языка значений маршрута.

Как я могу это исправить?

ИЗМЕНИТЬ

Я использовал ответ Дарина, но мне пришлось включить весь код из исходного фильтра авторизации (AuthorizeAttribute.cs). Причина зафиксирована в этом файле. Он обрабатывает случай, когда неавторизованный пользователь может получить защищенную страницу из кеша.

Вот комментарий в коде:

            // ** IMPORTANT **
            // Since we're performing authorization at the action level, the authorization code runs
            // after the output caching module. In the worst case this could allow an authorized user
            // to cause the page to be cached, then an unauthorized user would later be served the
            // cached page. We work around this by telling proxies not to cache the sensitive page,
            // then we hook our custom authorization code into the caching mechanism so that we have
            // the final say on whether a page should be served from the cache.

person Mathias F    schedule 20.05.2009    source источник


Ответы (1)


Проблема с проверкой подлинности с помощью форм заключается в том, что у вас не может быть динамически настраиваемого URL-адреса для входа. Именно так команда ASP.NET разработала фреймворк. В какой-то момент будет вызван метод FormsAuthentication.RedirectToLoginPage, который будет просто перенаправлять на жестко заданный URL-адрес в web.config.

Я вижу два возможных обходных пути:

  1. Не храните язык в URL-адресе, а в файле cookie
  2. Напишите настраиваемый ActionFilter, который перенаправляет на динамически создаваемую страницу входа в систему, если пользователь не аутентифицирован.

Вот пример использования настраиваемого атрибута:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class RequiresAuthenticationAttribute : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        IPrincipal user = filterContext.HttpContext.User;
        if (!user.Identity.IsAuthenticated)
        {
            filterContext.Result = new RedirectResult("CALCULATE YOUR LOGIN URL HERE FROM ROUTES");
        }
    }
}
person Darin Dimitrov    schedule 20.05.2009
comment
Дарин, это работает как амулет. Мне нужно было только добавить дополнительный код из исходного фильтра авторизации. - person Mathias F; 13.09.2009