在 ASP.NET Core 中,
IDataProtectionProvider是数据保护系统的核心接口,用于创建
IDataProtector实例,进而对敏感数据(如 Cookie 内容、临时令牌、连接字符串片段等)进行加密/解密。它不是直接用来加解密的,而是“工厂”——你用它获取有特定目的(purpose string)的保护器。
注册与获取 IDataProtectionProvider
ASP.NET Core 默认已自动注册数据保护服务(
IDataProtectionProvider和底层实现),无需手动 Add。你只需在需要的地方通过依赖注入获取即可: 在控制器中:通过构造函数注入
IDataProtectionProvider在中间件或静态工具类中:可通过
IHttpContextAccessor或从
IServiceScope解析 在 Program.cs / Startup.cs 中配置数据保护选项(如密钥存储位置、应用名称)可影响整个生命周期
用 purpose 字符串隔离保护上下文
同一个
IDataProtectionProvider可以创建多个不同用途的
IDataProtector,它们彼此独立、密钥隔离。这是关键安全实践:
provider.CreateProtector("Auth.Ticket") → 专用于认证票据
provider.CreateProtector("Email.ConfirmationToken") → 专用于邮箱验证令牌
即使底层密钥相同,不同 purpose 的加密结果无法互相解密,防止越权复用
加解密基本操作
拿到
IDataProtector后,使用
Protect()和
Unprotect()方法:
string encrypted = protector.Protect("my-secret-value");
string original = protector.Unprotect(encrypted);
Unprotect()失败时会抛出
CryptographicException(例如密钥轮换后旧数据无法解密,或被篡改),应捕获处理 输入输出都是
string(Base64 编码的字节数组),也支持
byte[]重载
常见配置与注意事项
默认情况下,数据保护系统使用临时密钥(重启丢失),生产环境必须显式配置持久化和应用标识:
调用AddDataProtection()并链式配置:
.SetApplicationName("MyApp-Production")
指定密钥存储位置:.PersistKeysToFileSystem(new DirectoryInfo("/shared/keys"))(Linux/容器推荐)或 .PersistKeysToAzureBlobStorage避免跨环境共享密钥目录;开发/测试/生产应使用不同
ApplicationName或密钥目录 不建议用数据保护 API 替代密码哈希(如用户密码)——它设计用于短期、可逆的保护,而非不可逆散列
基本上就这些。用好
IDataProtectionProvider的关键是:注入即用、purpose 隔离、生产配持久化、解密要异常处理。
