2013-04-12 13 views
7

私のMVCアプリケーションでは、フォーム認証を使用してユーザーを認証してから、System.IdentityModel.Services.SessionAuthenticationModuleでセッションを維持しています。MachineKeySessionSecurityTokenHandlerとアプリケーションの再起動の間にセッショントークンが期限切れになる

私がまだ必要ではない間に、System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandlerを利用して、アプリケーションがウェブファーム(Dominick Baier hereで説明されているように)にうまく生きるようにしたいと思いました。

問題は、machineKeyベースの処理では、セッションがサーバマシンからマシンまで有効であるだけでなく、アプリケーションの再起動後も存続する必要があることです。しかし、私がアプリケーションを再起動したり再ビルドしたりするときはいつでも、ブラウザでアプリケーションを起動すると、クッキーは無効になり、認証画面にバウンスされます。もう一度認証されると、すべてが問題なくセッションが残ります。しかし、次回アプリが再起動したり再構築されたときに、私は再認証を余儀なくされます。

私はこれがWIFの一面であると確信していますが、私はここからどこに向かうべきか分かりません。私はMachineKeySessionSecurityTokenHandlerを拡張しなければならないことを恐れていませんが、私が進む前にここで何が起こっているのかを確認したいと思います。私は、デフォルトのSessionSecurityTokenHandlerは、その暗号化のためにアプリケーションプールからのいくつかの識別子と組み合わせてDPAPIを使用することを理解しているので、この場合には起こるだろうが、MachineKeySessionSecurityTokenHandlerの動作が私を困惑させる。 MachineKeySessionSecurityTokenHandlerが依存している再起動時に再作成されるアプリケーションの識別子がまだありますか?私はちょうど設定が不足していますか?ここで

私のweb.configファイルから関連部分です:

<configSections> 
    <section name="system.identityModel" 
      type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
</configSections> 

...

<system.identityModel> 
    <identityConfiguration> 
    <securityTokenHandlers> 
     <remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
     <add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    </securityTokenHandlers> 
    </identityConfiguration> 
</system.identityModel> 

...

<system.web> 
    <machineKey compatibilityMode="Framework45" 
       validationKey="E27893..." 
       decryptionKey="ABC..." 
       validation="SHA1" decryption="AES" /> 
    <authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" 
     timeout="10080" /> 
    </authentication> 
</system.web> 

...

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="SessionAuthenticationModule" 
     type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    </modules> 
</system.webServer> 
+1

これを動かします。私は今やっていることのために働いているようなものを手に入れようと苦労していました。問題は私のweb.configsの値を得ることでした。 web.configの設定を投稿していただきありがとうございます。この問題を解決するのに役立ちました。 Mike –

+0

@indiecodemonkey - これがあなたを助けてくれてうれしい! –

+0

フォーム認証を使わずにSessionAuthenticationModuleを使用してユーザーを認証する場合、共有WIFキャッシングを実装するために最後の部分が必要です(アプリプールのリセットでリセットされないなど)。それはSessionSecurityTokenCacheです。 MSDN上の例はここにありますhttps://msdn.microsoft.com/en-us/library/hh545457(v=vs.110).aspx –

答えて

0

これは私の愚かな過ちでした。ここでは適切でない理由から、私は何か非標準にFedAuthクッキー名を設定する(すなわちない「FedAuth」)、このような:問題は、私は、現時点では、このようにそれを設定した

FederatedAuthentication 
    .FederationConfiguration 
    .CookieHandler 
    .Name = "SomeThingNotStandard"; 

私は成功したログインのトークンを発行した。まあ、もちろん、メモリ内の設定がCookie名として "SomeThingNotStandard"を探しているので、すべてうまくいくでしょう。しかし、アプリケーションを再起動すると、設定は "SomeThingNotStandard"ではなく "FedAuth"を探してデフォルトに戻ります。これにより再ログインが強制され、成功するとアプリケーションが再設定され、すべてが正常に機能しているように見えます。

私は上記のコードビットをApplication_Start()に入れて、再ビルドと再起動の間に正常に動作します。

私の一部ではダム移動。

編集:

私はあなたに感謝の言葉をドロップしたかった、クリス構成に

<system.identityModel.services> 
    <federationConfiguration> 
    <cookieHandler 
     name="SomeThingNotStandard" /> 
    </federationConfiguration> 
</system.identityModel.services> 
+0

私はあなたがこれを働かせる方法を見ていません。 WIFの既定値は、上記で指定した構成で再生するIN-MEMORYセッショントークンキャッシュです。リフレクターでSessionSecurityTokenCacheを開き、私の意味を見てみましょう[http://code.msdn.microsoft.com/Claims-Aware-Web-Farm-088a7a4f]キャッシュがメモリにある場合、アプリケーションのリサイクル時に大理石が失われます。私はカスタムSessionSecurityTokenCacheを使ってこれを実装し、リサイクルに耐えました。 – nachonachoman

+1

@pete_w - 私が提示した問題は、具体的には彼がキャッシュではなくクッキーハンドラに関することでした。実際、デフォルトのトークンキャッシュはメモリ内にあり、アプリのリサイクルは本質的にそれを拭き取ります。あなたのように、私はその問題を解決するために独自のカスタムキャッシュソリューションを展開しました。しかし、この問題は、私が悪いところでトークンクッキーのカスタム名を設定したことによるものです。 2つの別々の問題、本当に。 –

2

hm - 機械キーを明示的に設定している場合(そう思われるような) - これは動作しない理由はありません。他のクッキー、セッションなどを使って再認証の問題を引き起こしているのでしょうか?

+0

ああ、私は問題を発見しました。これは、Fedauthのクッキー名を何かカスタムに設定したために悪いところで私のところではちょっとばかげていました。私は以下の答えを投稿します。 –

関連する問題