2017-05-09 71 views
2

我已經在一些負載平衡的Linux服務器上部署了一個asp.net核心應用程序。由於拒絕ValidateAntiForgeryToken屬性(如果POST不返回與生成表單的機器相同的機器),將表單發佈到路由時出現錯誤。如何處理跨Linux服務器的ValidateAntiForgeryToken

隨着Windows和.Net經典我知道匹配MachineKey屬性在我的web.configmachine.config文件。

那麼,我如何在Linux主機上實現相同的功能,並允許一臺服務器上的令牌在另一臺服務器上進行驗證?

回答

1

因此,當您致電services.addMvc()時,Antiforgery支持會自動添加。您可以通過撥打services.AddAntiforgery(opts => "your options")來更改基本配置。

在引擎蓋下,令牌受ASP.Net Core Data Protection library(github回購here)的保護。默認情況下,我認爲這是在內存中,因此生成的密鑰然後用於令牌保護不會在多服務器/雲服務器場景中共享。

解決方案

所以分享防僞標記,你可以設置一個共享位置數據保護服務。默認的值,來與數據保護庫是:

//File system 
services.AddDataProtection() 
    .PersistKeysToFileSystem(new DirectoryInfo(@"\\some\shared\directory\")); 

//Registry 
services.AddDataProtection() 
    .PersistKeysToRegistry(Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Sample\keys")); 

然後有更好的共享存儲幾個默認的包括:(!和使用)

//redis 
var redis = ConnectionMultiplexer.Connect("my-redis-url"); 
services.AddDataProtection() 
    .PersistKeysToRedis(redis, "DataProtection-Keys"); 

//Azure 
services.AddDataProtection() 
    .PersistKeysToAzureBlobStorage(new Uri("blob-URI")); 

我還發現一個選項適用於github thanks to a github user named CL0SeY的AWS S3存儲。

爲了測試

默認情況下,令牌有90天的壽命。這可以在添加服務時設置。因此,獲得測試的簡單解決方案的一種方法是生成一個具有較長生命週期的文件系統的密鑰,然後將該令牌部署到服務器上的已知位置。然後建立了從該位置的數據保護,但告訴它從來沒有產生新的密鑰:

//generate a test key with this in a test app or whatever: 
services.AddDataProtection() 
     .PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp\")) 
     .SetDefaultKeyLifetime(TimeSpan.MaxValue); 


// then use that key in your app: 
services.AddDataProtection() 
     .PersistKeysToFileSystem(new DirectoryInfo(@"\some\allowed\directory")) 
     .DisableAutomaticKeyGeneration(); 

在Linux上

所有這一切都必須在與唯一的條件是,你在Linux主機上運行不應該引用Windows驅動器或位置(杜)。我不是100%確定如果您嘗試使用註冊表選項會發生什麼......