前言
上篇主要是對 ASP.NET Core 的 Data Protection 做了一個簡單的介紹,本篇主要是介紹一下API及使用方法。
API 接口
ASP.NET Core Data Protectio 主要對普通開發人員提供了兩個接口,IDataProtectionProvider 和 IDataProtector。
我們先看一下這兩個接口的關系:
namespace Microsoft.AspNetCore.DataProtection{ // // 摘要: // An interface that can provide data protection services. public interface IDataProtector : IDataProtectionProvider { byte[] Protect(byte[] plaintext); byte[] Unprotect(byte[] protectedData); }} 可以看到,IDataProtector繼承自IDataProtectionProvider ,并且提供了兩個方法 Protect 和 Unprotect ,從命名來看,一個是加密,一個是解密。而他們的簽名都是傳入一個byte數組,這也就意味著他們可以加密和解密一切對象。返回的也是byte數組,也就是說在實際的使用過程中,我們應該自己添加或者使用系統的一些擴展方法來具體化我們的需求。
我們再看一下IDataProtectionProvider接口:
namespace Microsoft.AspNetCore.DataProtection{ public interface IDataProtectionProvider { IDataProtector CreateProtector(string purpose); }} IDataProtectionProvider提供了一個方法,通過傳入一個 purpose字符串(見后面詳細介紹)來生成一個IDataProtector接口對象。
從這個接口的命名來看,它以Provider結尾,也就是說這部分我們可以實現自己的一套加解密的東西。
我們在閱讀微軟項目的源代碼的時候,經常看一些以xxxxProvider結尾的對象,那么它的職責是什么,同時扮演什么樣的角色呢?
其實這是微軟專門為ASP.NET設計的一個設計模式,叫Provider Model設計模式,也可以說它是由微軟發明的,它不屬于23種設計模式中的一種,從功能上來看的話,應該是工廠和策略的結合體。自ASP.NET 2.0開始,微軟就開始引入這種設計模式,最開始主要是用于實現應用程序的配置的多個實現。比如開發者最熟悉的web.config中, 針對于數據庫連接字符串的配置, 還有二進制,再比如XML啊等等很多,現在其他地方這種模式也用的越來越多起來。
再來說一下CreateProtector方法簽名中的 purpose 這個字符串,在上一篇博文中為了讀者好理解,我把傳入的purpose說成可以理解為一個公鑰,其實這個說法是不嚴謹的,可以理解為一個標識,指示當前Protector的用途。
在使用IDataProtector的時候,會發現它還有一些擴展方法位于Microsoft.AspNetCore.DataProtection命名空間下:
public static class DataProtectionCommonExtensions{ public static IDataProtector CreateProtector(this IDataProtectionProvider provider, IEnumerable<string> purposes); public static IDataProtector CreateProtector(this IDataProtectionProvider provider, string purpose, params string[] subPurposes); public static IDataProtector GetDataProtector(this IServiceProvider services, IEnumerable<string> purposes); public static IDataProtector GetDataProtector(this IServiceProvider services, string purpose, params string[] subPurposes); public static string Protect(this IDataProtector protector, string plaintext); public static string Unprotect(this IDataProtector protector, string protectedData);}
新聞熱點
疑難解答
圖片精選