2013-04-12 37 views
7

在我的MVC應用程序中,我使用表單身份驗證來驗證用戶,然後使用System.IdentityModel.Services.SessionAuthenticationModule來保持會話。MachineKeySessionSecurityTokenHandler和會話令牌在應用程序重新啓動之間到期

雖然我還沒有達到必要的程度,但我確實想要使用System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler,以便應用程序可以在網上農場中很好地生活(如Dominick Baier here所述)。

我遇到的問題是,鑑於基於machineKey的處理,我認爲不僅會話從服務器機器到機器是有效的,而且還應該在應用程序重新啓動後仍然存在。但是,無論何時我重新啓動或重建應用程序,在瀏覽器中點擊應用程序時,Cookie顯然都會變得無效,並且我會彈出身份驗證屏幕。一旦再次驗證,一切都很好,會話仍然存在。但是,下次應用程序重新啓動或重建時,我不得不重新進行身份驗證。

我確定這是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 cookie名稱的東西不規範的(即不是「FedAuth」),像這樣:

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

的問題,我只是在一瞬間設置它像這樣我在成功登錄時發佈了令牌。那麼,當然一切都會好起來的,因爲現在內存配置正在尋找「SomeThingNotStandard」作爲cookie的名字。但是,在重新啓動應用程序時,配置將恢復爲默認設置,查找「FedAuth」,而不是「SomeThingNotStandard」。這迫使重新登錄,一旦成功,重新配置應用程序,然後一切都很好。

所以我把上面的代碼放在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 - 我提出的問題是關於他的cookie處理程序,而不是緩存。事實上,默認的令牌緩存是內存中的,並且應用程序回收基本上將其抹去。像你一樣,我結束了自己的定製緩存解決方案來解決這個問題。但是,這個問題僅僅是由於我在不好的地方爲令牌cookie設置了自定義名稱。兩個單獨的問題,真的。 –

2

hm - 如果您明確設置機器密鑰(就像您似乎這樣做) - 我沒有看到這不起作用的原因。也許你正在使用其他的cookies,會話等觸發re-auth問題?

+0

呃,我發現了這個問題。由於將Fedauth cookie名稱設置爲自定義內容,但這在一個糟糕的地方,這只是愚蠢的做法。我會在下面發表答案。 –

相關問題