2017-02-08 19 views
0

У меня есть зрелое веб-приложение 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 

который все выглядит абсолютно правильно.

Спасибо за консультацию.

+0

Я просмотрел ссылочный источник [FormsAuthentication] (https://referencesource.microsoft.com/# System.Web/Security/FormsAuthenticationModule.cs, 0b747e35c2caa2bd) Модуль 'OnLeave()' и увидел, что он проверяет свойство, называемое Response.SuppressFormsAuthenticationRedirect'). Я полагаю, что установка этого параметра в true будет исправлять проблему (потому что я могу только предположить, что FA-модуль в конце конвейера переопределяет значение). Но нет! Установка этого значения в true не устраняет проблему !!! –

+0

Мой выше код вызывается из события 'Authenticate'' System.Web.UI.WebControls.Login' внутри UserControl на моей странице входа. После того, как вы вернулись к этому методу, свойства Response по-прежнему верны, однако следующий «Шаг отладчика» приведет меня к методу Render другого элемента управления пользователя, и я вижу, что «Response.RedirectLocation» в этот момент был вернувшись к '' /? raspberry = true '', поэтому что-то «магическое» в структуре ASP.NET между этими двумя событиями shandlers - это kiboshing мой тщательно настроенный Redirect :-(Теперь я не могу поверить, что это модуль FormsAuthentication. : –

ответ

0

Хорошо, я вижу, что вызывает его. Это факт, что я использую веб-контроль Login и запускаю свой код как часть события Authenticate. Рассматривая исходный источник для Login Web Control, событие Authenticate поднимается его методом AttemptLogin (ищите его в источнике). После повышения события и видя, что аутентификация прошла успешно, то переходит к:

  1. зову сам SetAuthCookie (я уже сделал это сам, но, предположительно, единственное, что я должен делать в моем коде, если аутентификация определения был успешным или нет, а не возиться с AuthCookie или перенаправляет)
  2. Выполнение редирект (перезаписана мой тщательно создающийся редирект)

Я буду иметь, чтобы выяснить, решение, как там эти методы являются частными (не может переопределить, наследуя usercontrol), и, похоже, нет опции для overring или suppre ssing пользователя его GetRedirectUrl().

 Смежные вопросы

  • Нет связанных вопросов^_^