Проигрышный сеанс между классическим ASP и ASP.NET - PullRequest
2 голосов
/ 05 мая 2010

Компания, в которой я работаю, осуществляет переход от классических программ ASP к программам ASP.NET для нашего программного обеспечения для внутренней сети. В конце концов, все будет написано в ASP.NET, но из-за нехватки времени все еще существует ряд программ, использующих классический ASP.

Для компенсации мы написали функции, которые позволяют перенаправлять и автологины между классическими программами ASP и программами ASP.NET. Однако я начинаю видеть проблему с удержанием состояния сеанса для нашего программного обеспечения ASP.NET. Если пользователь использует программу ASP.NET, затем работает в классической программе ASP, а затем возвращается к этой программе ASP.NET, часто аутентификация пользователя для программы ASP.NET все еще выполняется, но сеанс пользователя теряется, что приводит к ошибке при выполнении какой-либо функции в программе.

Я пытаюсь зафиксировать потерю состояния сеанса в событии Session_End global.asax, которое перенаправит пользователя на страницу входа, но это не сработало. Кто-нибудь еще сталкивался с подобной проблемой, когда пользователи переходили от классического ASP к ASP.NET и проигрывали сеансы? Это даже моя настоящая проблема здесь? Это единственное, что я вижу как проблему.

EDIT

Это то, что мы делаем, чтобы перенаправить пользователей на страницу ASP.NET с классической страницы asp.

Мы создаем хеш MD5 на основе идентификатора пользователя и даты и отправляем его на страницу redirect.aspx через строку запроса. Оттуда страница aspx создает свой собственный MD5 на основе идентификатора пользователя и даты, которые передаются через строку запроса. Если 2 хэша идентичны, пользователь проходит проверку подлинности, и программа загружается. Вот пример:

Классический ASP:

strDate = Year(Now())  & right("0" & Month(Now()), 2) & right("0" & Day(Now()), 2)
key = MD5(SessionUserID & strDate)
Response.Redirect "/redirect.aspx?key="&key&"&lpid="&ProgramID&"&unum="&SessionUserNum&"&uid="&SessionUserID&"&gid="&SessionGroupID

Redirect.aspx:

string key = Request.QueryString["key"];
//SetDesignModeState Variables:
if (getMd5Hash(Request.QueryString["uid"] + DateTime.Today.ToString("yyyyMMdd")) == key)
{
    Session["SessionGroupID"] = Request.QueryString["gid"];
    Session["SessionUserNum"] = Request.QueryString["unum"];
    Session["SessionUserID"] = Request.QueryString["uid"];
    string appID = Request.QueryString["lpid"];
    FormsAuthentication.SetAuthCookie(Request.QueryString["uid"], false);
    //redirect to ASP.NET page...

1 Ответ

3 голосов
/ 05 мая 2010

Я сделал с вами нечто подобное: аутентификация пользователей из устаревшего приложения ASP на сайте ASP.NET. Помогло бы, если бы вы могли предоставить немного больше подробностей (возможно, пример кода) процесса, который вы настроили, чтобы сделать это с пользователями, переходящими из устаревшего приложения в приложение ASPX.

Чтобы дать вам краткое представление, в моей реализации я сделал следующее:

  • Создать страницу .ASPX
  • Страница .ASPX принимает значения HTTP POST от определенного устаревшего приложения ASP * только 1008 * .
  • Когда получен запрос POST, я извлекаю значения имени пользователя и пароля, а затем перехожу к аутентификации обычным способом. Если пользователь успешно прошел аутентификацию, мы выдаем ему файл cookie FormsAuthentication.

На самом деле моя реализация немного сложнее: я использую базу данных в качестве резервного хранилища (поскольку оба приложения имеют общий источник данных) и отдельное поле базы данных для хранения случайного кода, который отправляется из классического приложения в сторона .NET для дальнейшей проверки того, что запрос, полученный приложением .NET, действителен.

EDIT:

Попробуйте вручную установить файл cookie для аутентификации. Удалить строку:

FormsAuthentication.SetAuthCookie(Request.QueryString["uid"], false); 

Заменить на:

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
                Request.QueryString["uid"],
                DateTime.Now,
                DateTime.Now.AddHours(24),
                false,
                null)

        string encryptedTicket = FormsAuthentication.Encrypt(ticket);
        HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);            
        HttpContext.Current.Response.Cookies.Add(cookie);

Видишь, как ты с этим справляешься?

...