public static IDataProtectionBuilder PersistKeysToRedis(this IDataProtectionBuilder builder, string redisConnectionString) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } if (redisConnectionString == null) { throw new ArgumentNullException(nameof(redisConnectionString)); } if (redisConnectionString.Length == 0) { throw new ArgumentException("Redis connection string may not be empty.", nameof(redisConnectionString)); } //因为在services.AddDataProtection()的时候,已经注入了IXmlRepository,所以应该先移除掉 //此处应该封装成为一个方法来调用,为了读者好理解,我就直接写了 for (int i = builder.Services.Count - 1; i >= 0; i--) { if (builder.Services[i]?.ServiceType == descriptor.ServiceType) { builder.Services.RemoveAt(i); } } var descriptor = ServiceDescriptor.Singleton<IXmlRepository>(services => new RedisXmlRepository(redisConnectionString, services.GetRequiredService<ILogger<RedisXmlRepository>>())) builder.Services.Add(descriptor); return builder.Use(); }
最终Services中关于DataProtection是这样的:
public void ConfigureServices(IServiceCollection services) { services.AddDataProtection() // ================以下是唯一标识============== //设置应用程序唯一标识 .SetApplicationName("my_app_sample_identity"); // =============以下是主加密键=============== //windows dpaip 作为主加密键 .ProtectKeysWithDpapi() //如果是 windows 8+ 或者windows server2012+ 可以使用此选项(基于Windows DPAPI-NG) .ProtectKeysWithDpapiNG("SID={current account SID}", DpapiNGProtectionDescriptorFlags.None) //如果是 windows 8+ 或者windows server2012+ 可以使用此选项(基于证书) .ProtectKeysWithDpapiNG("CERTIFICATE=HashId:3BCE558E2AD3E0E34A7743EAB5AEA2A9BD2575A0", DpapiNGProtectionDescriptorFlags.None) //使用证书作为主加密键,目前只有widnows支持,linux还不支持。 .ProtectKeysWithCertificate(); // ==============以下是存储位置================= //windows、Linux、macOS 下可以使用此种方式 保存到文件系统 .PersistKeysToFileSystem(new System.IO.DirectoryInfo("C:\\share_keys\\")) //windows 下可以使用此种方式 保存到注册表 .PersistKeysToRegistry(Microsoft.Win32.RegistryKey.FromHandle(null)) // 存储到redis .PersistKeysToRedis(Configuration.Section["RedisConnection"]) }
在上面的配置中,我把所有可以使用的配置都列出来了哦,实际项目中应该视实际情况选择。
总结
关于ASP.NET Core Data Protection 系列终于写完了,其实这这部分花了蛮多时间的,对于Data Protection来说我也是一个循循渐进的学习过程,希望能帮助到一些人。