2012-03-16 9 views
6

私は新しいMVC3アプリケーションを作成しました。これはWinHostの基本プランでホストされています。ログインしたユーザーはしばらくしてログアウトします

問題の要点は、アプリケーションプールのメモリ制限に達し、すべてのセッションInProcが消去されていることです。これは、ユーザーがログアウトしたことを意味します。

そのドキュメントを1として、私はこれを参照してください。ここでは

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

は、上記の手順に従った後、私のweb.configファイルの内容は次のとおりです。

<?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> 

ここで問題があります:

私のユーザーは、しばらくしてもまだログオンしています。セッションでSQLを使用することでこの問題を防ぐことができたと思います。

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"); 
     }    
    } 

[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); 
} 

そして、ここで私は、ユーザーがログインしているかどうかを確認するために使用するいくつかのコードです:ここでは

は、私は私のユーザーをlogginてる方法については、コードの該当ビットがあります

何か提案がありますか?多分、私のweb.configが壊れており、これが問題の原因です。セッション情報を追加した後に何かを削除する必要があったのでしょうか?

+0

あなたが見たときに、同じブラウザセッションを実行しているユーザーです役立つこと

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

ようにsystem.web下web.configファイルに配置することですログオフは起こるか? –

+0

はい、Firefoxを開き、Webサイト(Winhostでホストされている)にログインします。同じウェブサイト上で少し遊んで、数分後(時には数秒後)にログオフします。 –

+0

asp.netアプリケーションプールがリサイクルすると、これは空/空になりますか? 'context.Request.IsAuthenticated'?もしそうなら、これは問題を引き起こしているかもしれません。 SQLセッションに切り替えた場合、ユーザーがログインしているかどうかを確認する必要がありますか? –

答えて

4

ガベージコレクタがアプリケーションに割り当てられたマシンキーを消去し、ユーザーが慣れたユーザーをログアウトさせる新しいキーを割り当てるため、このエラーが発生することがあります。ソリューションは、アプリケーションのmachineKeyを生成し、このリンクはあなたhttp://aspnetresources.com/tools/machineKey

+0

ありがとうございました。だから私は自分の鍵を生成し、それを私のweb.configに入れました。それを動作させるために他のオプションを設定する必要がありますか、それともweb.configに配置して実行するだけですか? –

+0

ジンクスするつもりはありませんが、web.configファイルにこれを追加して解決しました。 :) 2時間で確認します。私はまだログオンしているはずです。 –

+0

それを設定に入れるだけです... ';)' – Rafay

-1

フォーム認証はセッション関連ではありません。セッション状態とは何の関係もありません。必要なものはすべてフォームの認証Cookieに保存されます。

上記のタイムアウトは2880に設定されています。つまり、48時間です。つまり、タイムアウトが発生することを期待しています。

+0

これで私のユーザーのログイン方法は間違っていないので、うまくいくはずです。一方、私もタイムアウトが起こると予想していますが、現在はタイムアウトは2時間にとどまらず2日にも達しません。他のアイデア? –

+0

私は 'HttpContext.Request.IsAuthenticated'を使ってユーザーがログインしているかどうかを確認しています。これはInProcセッション(MVC3のデフォルト)でうまく動作するのと同じようにSQLセッションでうまくいくのですか? –

+0

実際にチケットを復号化してチェックして(ログに記録して)、何が起こっているのかをよりよく把握できるようにします:http://www.hanselman.com/blog/AccessingTheASPNETFormsAuthenticationTimeoutValue。aspxあなたはあなたのアプリケーションの他の場所で他のセッションチェックをしていないと確信していますか?一部の人々は、セッションを同期しようとします(または、セッションではないことを前提としています)。そして、authタイムアウトを形成しますが、互いの同期がとれません。 sessionが空の場合にログインするようにリダイレクトするコードがアプリケーション内にある場合は、別の問題の原因になる可能性があります。 –

関連する問題