2012-03-16 9 views
6

Zrobiłem nową aplikację MVC3 i jest ona hostowana na podstawowym planie WinHost.Zalogowani użytkownicy się wylogowali po pewnym czasie

Istotą problemu jest osiągnięcie limitów pamięci puli aplikacji i usunięcie każdej sesji InProc, co oznacza, że ​​moi użytkownicy są wylogowani.

jak na ich dokumentacji, widzę to:

http://support.winhost.com/KB/a626/how-to-enable-aspnet-sql-server-session-on-your-web.aspx

Oto treść mojego web.config po wykonaniu czynności opisanych powyżej:

<?xml version="1.0"?> 
<!-- 
    For more information on how to configure your ASP.NET application, please visit 
    http://go.microsoft.com/fwlink/?LinkId=152368 
    --> 
<configuration> 
    <connectionStrings>  
    <!-- REMOVED FOR PRIVACY --> 
    </connectionStrings> 
    <appSettings> 
    <add key="webpages:Version" value="1.0.0.0"/> 
    <add key="ClientValidationEnabled" value="true"/> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
    </appSettings> 
    <system.web>  
    <sessionState mode="SQLServer" 
        allowCustomSqlDatabase="true"     
        cookieless="false" 
        timeout="2880" 
        sqlConnectionString="data Source='tcp:s407.winhost.com';database='DB_41_xx';user id='DB_11_xx_user'; password='xx';" /> 
    <trust level="Full"/> 
    <compilation debug="true" targetFramework="4.0"> 
     <assemblies> 
     <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     </assemblies> 
    </compilation> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/" timeout="2880"/> 
    </authentication> 
    <membership> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/"/> 
     </providers> 
    </membership> 
    <profile> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/> 
     </providers> 
    </profile> 
    <roleManager enabled="false"> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/"/> 
     <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/"/> 
     </providers> 
    </roleManager> 
    <pages> 
     <namespaces> 
     <add namespace="System.Web.Helpers"/> 
     <add namespace="System.Web.Mvc"/> 
     <add namespace="System.Web.Mvc.Ajax"/> 
     <add namespace="System.Web.Mvc.Html"/> 
     <add namespace="System.Web.Routing"/> 
     <add namespace="System.Web.WebPages"/> 
     </namespaces> 
    </pages> 
    </system.web> 
    <system.webServer> 
    <validation validateIntegratedModeConfiguration="false"/> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/> 
     <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/> 
     <bindingRedirect oldVersion="0.0.0.0-4.0.8.0" newVersion="4.0.8.0"/> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

Tu leży problem:

Moi użytkownicy nadal logują się po pewnym czasie. Myślałem, że używanie SQL do sesji zapobiegnie temu problemowi.

Oto odnośny fragment kodu, w jaki sposób mam zalogowaniu moje użytkownikom w:

[HttpPost] 
public ActionResult Login(LogOnModel model) 
{ 
    using (EfAccountRepository accountRepository = new EfAccountRepository()) 
    { 
     if (accountRepository.ValidateCredentials(model.Email, model.Password)) 
     { 
      FormsAuthentication.SetAuthCookie(model.Email, true); 
      return RedirectToAction("Index", "Home"); 
     }  
    } 

    ModelState.AddModelError("", "Your email or password is incorrect."); 
    return View(model); 
} 

i tu jest jakiś kod, którego używam do sprawdzenia, czy użytkownik jest zalogowany:

public static MvcHtmlString AdminDashboardLink() 
    { 
     if (SecurityHelpers.UserIsPartOfCompany(HttpContext.Current)) 
     { 
      string html = "<li><a href='/Admin'>ADMIN DASHBOARD</a></li>"; 
      return new MvcHtmlString(html); 
     } 
     else 
     { 
      return new MvcHtmlString(""); 
     } 
    } 

    public static bool UserIsPartOfCompany(HttpContext context) 
    { 
     if (!context.Request.IsAuthenticated) 
      return false; 

     using (EfAccountRepository accountRepository = new EfAccountRepository()) 
     { 
      var loggedInUser = accountRepository.FindByEmail(context.User.Identity.Name); 
      string[] userRoles = accountRepository.GetRolesForUser(loggedInUser.AccountId); 

      return userRoles.Contains("Editor") || userRoles.Contains("Finance") || userRoles.Contains("Administrator"); 
     }    
    } 

Wszelkie sugestie? Może mój web.config jest spartaczony i to powoduje problemy. Może musiałem też usunąć coś po dodaniu informacji o sesji?

+0

Czy użytkownik uruchamiający tę samą sesję przeglądarki, gdy widzisz wylogowanie się dzieje? –

+0

Tak, otwieram Firefox, loguję się na stronę internetową (hostowaną na Winhost). Pobaw się trochę na tej samej stronie i po kilku minutach (czasem kilka sekund później) wyloguję się. –

+0

Gdy pula aplikacji asp.net poddaje się recyklingowi, czy będzie ona pusta? 'context.Request.IsAuthenticated'? Jeśli tak, może to być przyczyną problemu. Jeśli przełączyłem się na sesję SQL, czy muszę zmodyfikować sposób sprawdzania, czy użytkownik jest zalogowany? –

Odpowiedz

4

Spowodowane jest to czasami, ponieważ śmieciarz czyści klucz maszynowy przypisany do aplikacji i przypisuje nowy klucz, który powoduje, że wylogowani użytkownicy wylogowują się. Rozwiązanie jest generowanie machineKey dla aplikacji i umieścić go w pliku web.config pod system.Web jak

<system.web> 
    <machineKey validationKey="###YOUR KEY HERE ###" 
       decryptionKey="## decrypt key here ##" 
       validation="SHA1" decryption="AES" /> 
... 
... 

ten link może pomóc http://aspnetresources.com/tools/machineKey

+0

Dziękuję za pomoc. Więc wygenerowałem swój klucz i umieściłem go w moim web.config. Czy muszę ustawić inną opcję, aby działała, czy jest to tylko kwestia umieszczenia jej w pliku web.config i ukończenia? –

+0

Nie zamierzam jinx, ale wydaje się, po prostu dodanie tego do pliku web.config, rozwiązany! :) Potwierdzę za dwie godziny; Nadal powinienem być zalogowany. –

+0

wystarczy umieścić go w config ... ';)' – Rafay

-1

Autoryzacja formularzy nie jest związana z sesją. Nie ma nic wspólnego ze stanem sesji. Wszystko, co jest wymagane, jest przechowywane w pliku cookie formularzy.

Twój limit czasu jest ustawiony na 2880, czyli 48 godzin, czyli dwa dni, więc spodziewam się, że nastąpi przekroczenie limitu czasu.

+0

Ok, więc sposób, w jaki loguję się do moich użytkowników, nie jest niepoprawny i powinien działać dobrze. Z drugiej strony, ja też oczekiwałbym, że wydłuży się czas oczekiwania - ale obecnie ten limit czasu wynosi nawet dwa dni, a tym bardziej dwie godziny. Jakieś inne pomysły? –

+0

Używam 'HttpContext.Request.IsAuthenticated', aby sprawdzić, czy użytkownicy są zalogowani. Czy to dobrze gra z SQL Sessions, w ten sam sposób działa poprawnie na sesje InProc (domyślnie MVC3)? –

+0

Można faktycznie odszyfrować bilet i sprawdzić go (i zalogować), aby lepiej zrozumieć, co się dzieje: http://www.hanselman.com/blog/AccessingTheASPNETFormsAuthenticationTimeoutValue.aspx czy na pewno nie masz innych kontroli sesji w innym miejscu aplikacji? Niektórzy próbują zsynchronizować (lub zakładają, że są to synchronizacje, które nie są) sesja i formularze auth Timeout, ale nie będą zsynchronizować się ze sobą. Jeśli masz kod w innym miejscu aplikacji, aby przekierować się do logowania, jeśli sesja jest pusta, może to być inne źródło Twojego problemu. –

Powiązane problemy