Ответ 1
Параметр quurystring returnUrl добавляется к перенаправлению на страницу входа в класс FormsAuthentication в сборке System.Web.dll. Перегрузка метода FormsAuthenticion.RedirectToLoginPage в конечном итоге вызывает внутренний метод GetLoginPage. И имя переменной ReturnUrl, и LoginUrl можно переопределить с помощью настроек web.config.
Когда авторизованный запрос AuthorizeAttribute по умолчанию встречает несанкционированный запрос, он просто возвращает HttpUnauthorizedResult, который является всего лишь оберткой вокруг HttpStatusCodeResult с кодом состояния 401. Модуль FormsAuthenticationModule запускается за кулисами и выполняет остальную часть работы. Прямого взаимодействия между MVC и этими базовыми классами нет, если вы, конечно, не вызываете статические методы класса FormsAuthentication напрямую.
Ваше решение является стандартным, если вы хотите переопределить это поведение.
Метод GetLoginPage, который выполняет эту работу, выглядит следующим образом:
internal static string GetLoginPage(string extraQueryString, bool reuseReturnUrl)
{
HttpContext current = HttpContext.Current;
string loginUrl = FormsAuthentication.LoginUrl;
if (loginUrl.IndexOf('?') >= 0)
{
loginUrl = FormsAuthentication.RemoveQueryStringVariableFromUrl(loginUrl, FormsAuthentication.ReturnUrlVar);
}
int num = loginUrl.IndexOf('?');
if (num >= 0)
{
if (num < loginUrl.Length - 1)
{
loginUrl = string.Concat(loginUrl, "&");
}
}
else
{
loginUrl = string.Concat(loginUrl, "?");
}
string str = null;
if (reuseReturnUrl)
{
str = HttpUtility.UrlEncode(FormsAuthentication.GetReturnUrl(false), current.Request.QueryStringEncoding);
}
if (str == null)
{
str = HttpUtility.UrlEncode(current.Request.RawUrl, current.Request.ContentEncoding);
}
loginUrl = string.Concat(loginUrl, FormsAuthentication.ReturnUrlVar, "=", str);
if (!string.IsNullOrEmpty(extraQueryString))
{
loginUrl = string.Concat(loginUrl, "&", extraQueryString);
}
return loginUrl;
}