前言
.NET Core 2.0 發布之后,在Authentication中間件部分,相關API有不少改動(官方文檔),本文主要講的就是實現應用Cookie共享,對Cookie中間件使用不了解的可以去查看官方文檔,希望本文對大家有一些幫助。
ASP.NET Core 2.0 數據保護(Data Protection)
在一些需要負載場景,需要Cookie共享,需要對Cookie進行加密和解密操作,那么我們需要實現一些方法來對Data Protection進行分布式配置,本文主要介紹使用IXmlRepository接口。
IXmlRepository接口主要提供了持久化以及檢索XML的方法,它只要提供了兩個API:
//檢索所有存在的加密的xml文件
IReadOnlyCollection<XElement> GetAllElements();
//存儲data protection xml
void StoreElement(XElement element, string friendlyName);
IXmlRepository自定義實現
備注:我這里只是簡單實現讀取應用根目錄的Key文件,大家可以自定義存儲到DB或者Redis中。
public class XmlRepository:IXmlRepository { private readonly string _KeyContentPath = ""; public XmlRepository() { _KeyContentPath = Path.Combine(Directory.GetCurrentDirectory(),"ShareKeys", "key.xml"); } public IReadOnlyCollection<XElement> GetAllElements() { //加載key信息 var elements = new List<XElement>() { XElement.Load(_KeyContentPath) }; return elements; } public void StoreElement(XElement element, string friendlyName) { //本文忽略實現存儲功能,因為我們只需要讀取已存在的Key即可 } }
注意:每個應用站點下的Key文件存放位置和內容必須一致,本文的Key放在了應用根目錄下面的“ShareKeys”文件夾中,文件為key.xml
ASP.NET Core 2.0 實現Cookie共享
Cookie共享又分為應用部署在同一機器和應用部署在不同機器或Docker
應用部署在同一機器上
這種部署實現Cookie共享是比較簡單的,只需設置每個應用中Data Protection中間件PersistKeys的方式相同即可,推薦使用PersistKeysToFileSystem
services.AddDataProtection() .SetApplicationName("cookieshare") //windows、Linux、macOS 下可以使用此種方式 保存到文件系統 .PersistKeysToFileSystem(new System.IO.DirectoryInfo("C:\\share_keys"));
應用部署在同不同機器上或Docker中
這種部署實現Cookie共享需要借助上面我們實現的XmlRepository來進行設置,具體方式如下。
services.AddDataProtection() .SetApplicationName("cookieshare") .AddKeyManagementOptions(options => { //配置自定義XmlRepository options.XmlRepository = new XmlRepository(); });
Make .NET Great Again
ASP.NET CORE 2.0 API雖然有一些改動,就整體而言我覺得是越來越好了,總有一些東西需要改變,我們需要去適應,並努力完善整個社區環境,而不是抱怨。如果大家覺得有用,請點一個贊,您的認可是我最大的動力。
示例源碼:https://github.com/myloveCc/CookieShare
參考文檔
http://www.cnblogs.com/savorboard/p/dotnetcore-data-protected-farm.html
http://www.cnblogs.com/dudu/p/6495951.html
https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?tabs=aspnetcore1x