2011-02-01 2 views
1

Я использую openid-селектор с DotNetOpenAuth в своем приложении MVC 3. Всякий раз, когда я устанавливаю переменную сеанса, а разделы DotNetOpenAuth находятся в файле web.config, мои переменные сеанса не сохраняются после перенаправления.DotNetOpenAuth ASP.NET MVC 3 Session Issue

Я проверил переменную Session.SessionID, и она по-прежнему остается такой же, поэтому я нахожусь в том же сеансе (я считаю), но когда я проверяю переменные сеанса, которые я просто установил после перенаправления, все они имеют значение null.

Я еще никого не видел с этой проблемой. Мне интересно, только DotNetOpenAuth еще не готов к MVC 3. Я также использую последнюю версию DotNetOpenAuth.

Вот соответствующие участки web.config, если это поможет:

<configSections> 
    <section name="uri" type="System.Configuration.UriSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> 
    <section name="dotNetOpenAuth" type="DotNetOpenAuth.Configuration.DotNetOpenAuthSection" requirePermission="false" allowLocation="true"/> 
    </configSections> 
    <uri> 
    <idn enabled="All"/> 
    <iriParsing enabled="true"/> 
    </uri> 
    <system.net> 
    <defaultProxy enabled="true"/> 
    <settings> 
     <servicePointManager checkCertificateRevocationList="true"/> 
    </settings> 
    </system.net> 
    <dotNetOpenAuth> 
    <openid> 
     <relyingParty> 
     <security requireSsl="false"/> 
     <behaviors> 
      <add type="DotNetOpenAuth.OpenId.Behaviors.AXFetchAsSregTransform, DotNetOpenAuth"/> 
     </behaviors> 
     </relyingParty> 
    </openid> 
    <messaging> 
     <untrustedWebRequest> 
     <whitelistHosts> 
      <add name="localhost"/> 
     </whitelistHosts> 
     </untrustedWebRequest> 
    </messaging> 
    <reporting enabled="true"/> 
    </dotNetOpenAuth> 

Обновлено:

это происходит на моем сервере разработки, либо в IIS, или когда я бегу ASP. NET.

Кроме того, я попытался запустить сеанс в процессе и из процесса, используя государственный сервер, и это не повлияло.

Что касается нового сеанса, я проверил событие session_start и не вызывается. Я также проверил Session.IsNewSession, и он также вернулся к false. Итак, что-то случайно (или, может быть, не так случайно) удаляет мои переменные сеанса!

ответ

1

Обнаружена проблема здесь (давно уже). По-видимому, MVC2 все равно, если у меня есть представление о моих действиях, где я только что обработал, а затем перенаправил.

Однако, начиная с MVC3, после моего обновления, если у меня не было представления для моего действия, на странице была зарегистрирована ошибка, и после того, как произошла ошибка, инфраструктура не сохранила переменные сеанса, которые я только что установил.

Так просто исправить ... добавьте представления, а затем убедитесь, что в представлениях нет ошибок.

0

Это должно сработать. Я использовал DotNetOpenAuth с ASP.NET MVC 3 без каких-либо проблем. Возможно, вам захочется проверить, что ваш сеанс не истекает во время работы пользователя, на удаленном сайте для проверки подлинности. Тот факт, что вы получаете тот же SessionId, не означает, что сеанс не истек. Это также может произойти, если сервер перезапустит AppDomain.

+0

Оцените ответ, так оно происходит на моем сервере разработки, либо в IIS, либо при запуске сервера разработки ASP.NET. Не понимаю, что происходит. Я удаляю DotNetOpenAuth, все работает. я сделаю еще несколько исследований, чтобы узнать, перезапускается ли сеанс и что вызывает его. – Darye

1

Не лучший ответ, но я понял, что это response.redirect, который по какой-то причине убивает переменные сеанса.

Так что я просто сделал это вместо javascript-перенаправления, сессия остается, все работает нормально. На самом деле я не знаю, какова настоящая проблема, но эй, у меня нет всего дня, чтобы понять это.

+0

Будьте осторожны с перенаправлением домотканых. DotNetOpenAuth может использовать 301 переадресацию или переадресацию javascript на основе размера полезной нагрузки сообщения. Если вы сделаете это самостоятельно, надеюсь, ваш код будет устойчив перед лицом этого сорта, который вы можете получить от DotNetOpenAuth. –

+0

У меня возникла такая же проблема после обратного вызова Twitter OAuth. Я попробую переадресацию javascript и посмотрю, будут ли эти wortks. – jeremcc

0

DotNetOpenAuth, конечно же, не имеет Session.Abandon или Session.Clear в любом месте своей кодовой базы. Кажется возможным, что если вы настраиваете файлы cookie после, при передаче будет отправлено перенаправление, что эти файлы cookie будут потеряны. Переменные сессии обычно не сохраняются как файлы cookie отдельно, поэтому, если вы сделали cookie сеанса (и, по-видимому, это похоже), тогда остальное ваше состояние должно быть там.

Было бы интересно разобраться в этом, реализовав собственный магазин сеансов и проверив, что происходит на самом деле.