У меня есть зрелое веб-приложение ASP.NET с использованием FormsAuthentication (FA) для управления входами. В определенных ситуациях я хотел бы перенаправить пользователя «только что зарегистрированного пользователя» на другой URL-адрес, который использует FA. В соответствии со стандартной функциональностью FA будет перенаправляться на нашу обычную домашнюю страницу (указанную в web.config), если redirectUrl не использовался, когда он попадает на страницу, для которой требуется аутентифицированный пользователь.ASP.NET FormsAuthenticationModule DefaultUrl переопределяет явное
В моей системе, после пользователя имя пользователя/пароль проверяется Я обычно использую
FormsAuthentication.RedirectFromLoginPage(userName, createPersistentCookie: true); // Also calls SetAuthCookie()
, который обрабатывает большинство ситуаций. Однако, в зависимости от определенных условий (в основном на основе только что зарегистрированной роли пользователя), я хочу перенаправить на другой пункт назначения. Мои мысли для этого - позвонить мне SetAuthCookie()
, а затем использовать Response.Redirect(myUrl, false);
и ApplicationInstance.CompleteRequest()
.
Несмотря на это, самый следующий запрос используется для URL-адреса, определенного в моем теге web.config.
<authentication mode="Forms">
<forms loginUrl="~/Login" timeout="120" cookieless="UseCookies" defaultUrl="~/?raspberry=true" />
</authentication>
Вот фактический код, я использую (если требуется другой URL, он задается overrideUrl
параметра:
internal static void CreateTicket(string userName, string overrideUrl)
{
// Ref: http://support.microsoft.com/kb/301240
if (overrideUrl == null)
{
FormsAuthentication.RedirectFromLoginPage(userName, createPersistentCookie: true); // Includes call to SetAuthCookie()
}
else
{
FormsAuthentication.SetAuthCookie(userName, createPersistentCookie: true, strCookiePath:FormsAuthentication.FormsCookiePath);
HttpContext.Current.Response.Redirect(overrideUrl, false);
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
}
Если я прохожу в значении /special/path
для overrideUrl
я бы как следующий запрос, чтобы прийти, чтобы быть «/ специальный/путь». Вместо этого я вижу /?raspberry=true
ли что-то еще заставляет defaultUrl? есть ли способ, чтобы «подглядывать» в OBJE Response ct во время отладки, чтобы увидеть, действительно ли перенаправление уже существует? или установить точку останова, когда он будет установлен, чтобы я мог смотреть на стек вызовов?
EDIT: В конце моего метода, объект Response показывает следующие свойства:
RedirectLocation: "/special/path"
Status: "302 Found"
StatusCode: 302
StatusDescription: "Found"
IsRequestBeingRedirected: true
HeadersWritten: false
который все выглядит абсолютно правильно.
Спасибо за консультацию.
Я просмотрел ссылочный источник [FormsAuthentication] (https://referencesource.microsoft.com/# System.Web/Security/FormsAuthenticationModule.cs, 0b747e35c2caa2bd) Модуль 'OnLeave()' и увидел, что он проверяет свойство, называемое Response.SuppressFormsAuthenticationRedirect'). Я полагаю, что установка этого параметра в true будет исправлять проблему (потому что я могу только предположить, что FA-модуль в конце конвейера переопределяет значение). Но нет! Установка этого значения в true не устраняет проблему !!! –
Мой выше код вызывается из события 'Authenticate'' System.Web.UI.WebControls.Login' внутри UserControl на моей странице входа. После того, как вы вернулись к этому методу, свойства Response по-прежнему верны, однако следующий «Шаг отладчика» приведет меня к методу Render другого элемента управления пользователя, и я вижу, что «Response.RedirectLocation» в этот момент был вернувшись к '' /? raspberry = true '', поэтому что-то «магическое» в структуре ASP.NET между этими двумя событиями shandlers - это kiboshing мой тщательно настроенный Redirect :-(Теперь я не могу поверить, что это модуль FormsAuthentication. : –