因此,當您致電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%確定如果您嘗試使用註冊表選項會發生什麼......