C # Как я могу сохранить информацию о сеансе или куки после перенаправления OAuth? - PullRequest
1 голос
/ 21 сентября 2011

У меня есть пользователи, которые заходят на мой сайт через Facebook. Они отправляются с моего сайта в Facebook, а затем перенаправляются обратно после разрешения сайта. Проблема, с которой я сталкиваюсь, - это доступ к переменным Session, которые я установил до того, как они покинули сайт. Когда пользователь возвращается на сайт, создается совершенно новый сеанс. Странно то, что если пользователь перемещается по сайту, некоторые страницы исходного сеанса будут доступны, а иногда и вновь созданный сеанс. Я пытался создать куки: Response.Cookies ["user"] ["LoggedIn"] = "true"; Пока пользователь не покинул сайт, я в состоянии получить доступ к этим файлам cookie, но как только они уходят и возвращаются, я, похоже, тоже не могу получить к ним доступ. Итак, мой вопрос: каков наилучший способ сохранить данные до того, как пользователь будет удален с сайта, до того момента, когда он будет перенаправлен обратно?

AccountController:

public void Login()
{
    Session["BeforeLogin"] = "foo";
    redirect(FacebookUrl);
}

//Where Facebook redirects the user back to
public ActionResult OAuth(string code, string state)
{
    if (LoginSuccessful)
    {
        Session["LoggedIn"] = true;
    }
    return View();
}

HomeController:
    public HomeController()
{
    setLoggedInSession();
}

public void setLoggedInSession()
{
    //This is where I'm having the inconsistency
    string foo = Session["BeforeLogin"];
    ViewData["LoggedIn"] = Session["LoggedIn"];
    //It'll either be BeforeLogin is null and LoggedIn is true
    //or BeforeLogin will be "foo" and LoggedIn will be null
}

EDIT: Некоторая новая информация об этой проблеме. Проведя некоторое тестирование, я обнаружил, что сессия, кажется, работает нормально, когда я использую только один экземпляр. Когда я делаю высокую доступность, хотя (работает 5 экземпляров), когда я начинаю испытывать проблемы. Наиболее заметно в IE. Моя гипотеза заключается в том, что когда вы перенаправляетесь обратно на сайт из Facebook, вы получаете экземпляр, отличный от того, который вы оставили, и он создает новый сеанс, прежде чем ему удастся восстановить исходный.

Ответы [ 5 ]

1 голос
/ 22 сентября 2011

Я предполагаю, что вы используете режим по умолчанию для состояния сеанса, который основан на использовании файлов cookie в режиме proc.

В режиме по умолчанию ожидаемое вами поведение ожидается.Вы устанавливаете значения в памяти одного процесса одной виртуальной машины, который волшебным образом не перейдет к другой виртуальной машине или процессу.А поскольку Azure может направлять ваши запросы в любой экземпляр, только по счастливой случайности вы можете получить то же значение сеанса, которое вы установили.На самом деле, если вы попытаетесь достаточно долго, вы увидите, что даже в одном экземпляре ваши значения сеанса исчезнут при перезагрузке виртуальной машины или IIS перезапустит ваш рабочий процесс.

В * 1006 содержится довольно мало информации* в режимах состояния сеанса.

Но я рекомендую избегать использования состояния сеансов.К тому времени, когда вы освоите сеансы, вы уже будете хорошо знакомы с обработкой http в конвейере IIS и больше не будете нуждаться в этой абстракции.

0 голосов
/ 22 сентября 2011

Если файлы cookie ломаются, вы можете решить эту проблему, добавив параметр строки запроса в URL-адрес обратного вызова, а затем вставьте его обратно в данные сеанса, если присутствует параметр строки запроса.

Обратный вызов приложения Facebook не проходит проверку при отправке параметров строки динамического запроса и передает их обратно так же, как они отправляются.

0 голосов
/ 22 сентября 2011

Кэширование AppFabric: «Согласованная модель разработки как для Windows Azure AppFabric, так и для Windows Server AppFabric. Защищенный доступ и авторизация обеспечивается службой контроля доступа. " Он не является резидентом какого-либо одного экземпляра.

0 голосов
/ 22 сентября 2011

Если вы хотите использовать постоянный файл cookie, вам нужно что-то вроде этого:

Response.Cookies.Add(new HttpCookie("name", "value") { Expires = DateTime.UtcNow + TimeSpan.FromDays(7) });
0 голосов
/ 21 сентября 2011

Проблема в том, что когда Facebook выполняет обратный вызов, в запросе не передается сессионный cookie, поэтому .Net создает новый. Вы должны увидеть это, если будете выполнять отладку во время работы fiddler.

Если вы хотите передать переменную, поместите ее в обратный вызов QueryString или используйте ajax для выполнения запроса. Социальные плагины отлично подходят для такого рода вещей.

Между прочим, вы знаете, что хранение любого вида аутентификации / авторизации в сеансе абсолютно небезопасно. Я думаю, что ваш код только для отладки, но подумал, что упомяну это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...