管理 VSPackage 中的敏感选项数据
Manage sensitive Options data in VSPackage
我正在开发一个需要连接到数据库的 Visual Studio 扩展包 (VSIX)。
我还想在存储敏感配置时采取合理的安全预防措施。
目前,我正在为我的插件使用标准的 属性-grid 选项页面,如 Visual Studio 扩展的 introductory documentation 中所述。
public class MyPackageOptions : DialogPage
{
[Category("Repository")]
[DisplayName("Server")]
[Description("Database host name or IP address")]
public String Server { get; set; }
[Category("Repository")]
[DisplayName("Port")]
[Description("Database listen port")]
public UInt16 Port { get; set; } = 3306;
[Category("Repository")]
[Description("Database name")]
public String Database { get; set; } = "default_database_name";
[Category("Repository")]
[DisplayName("User ID")]
[Description("Database login user name")]
public String UserId { get; set; }
// BUG PasswordPropertyTextAttribute doesn't seem to be having the desired effect
[Category("Repository")]
[Description("Database login password")]
[PasswordPropertyText]
public String Password { get; set; }
}
Category
、DisplayName
和 Description
属性在 属性 网格显示上具有我期望的效果。但是 PasswordPropertyTextAttribute
似乎没有任何效果。有没有其他方法可以使文本屏蔽与基本的 属性-基于网格的选项页面一起使用?或者我是否需要制作自定义选项 UI 表单来获取文本屏蔽?
其次,我如何确保密码字段值以合理安全的方式保存在磁盘上,类似于其他需要存储用户凭据的软件?对于我的需要,我认为使用当前用户帐户的 Windows DPAPI 保护就足够了,但我不确定如何使用它来保护 MyPackageOptions.Password
属性 .
要使 PasswordPropertyTextAttribute
生效,必须通过将其 Password
属性 设置为 true
来“打开”它。如果使用默认构造函数,则 Password
属性 为 false
并且该属性无效。
使其工作的最简单方法是使用 [PasswordPropertyText(true)]
行而不是 [PasswordPropertyText]
行将属性添加到 属性 以调用适当的 non-default构造函数。
可以通过覆盖 DialogPage
LoadSettingsFromStorage
, SaveSettingsToStorage
, LoadSettingsFromXml
, and SaveSettingsToXml
methods as described in .
来加密持久化选项值
实现自定义 TypeConverter
来处理 encryption/decryption(类似于 this approach)没有用,因为相同的 TypeConverter
用于转换 to/from PropertyGrid
中的字符串值,以及在 Visual Studio 注册表或 XML 导出中保留值时。因此,如果转换器可以处理 PropertyGrid 中的纯文本输入,那么当对象保存到存储或导出到 XML.
时,它也会生成纯文本字符串。
我正在开发一个需要连接到数据库的 Visual Studio 扩展包 (VSIX)。
我还想在存储敏感配置时采取合理的安全预防措施。
目前,我正在为我的插件使用标准的 属性-grid 选项页面,如 Visual Studio 扩展的 introductory documentation 中所述。
public class MyPackageOptions : DialogPage
{
[Category("Repository")]
[DisplayName("Server")]
[Description("Database host name or IP address")]
public String Server { get; set; }
[Category("Repository")]
[DisplayName("Port")]
[Description("Database listen port")]
public UInt16 Port { get; set; } = 3306;
[Category("Repository")]
[Description("Database name")]
public String Database { get; set; } = "default_database_name";
[Category("Repository")]
[DisplayName("User ID")]
[Description("Database login user name")]
public String UserId { get; set; }
// BUG PasswordPropertyTextAttribute doesn't seem to be having the desired effect
[Category("Repository")]
[Description("Database login password")]
[PasswordPropertyText]
public String Password { get; set; }
}
Category
、DisplayName
和 Description
属性在 属性 网格显示上具有我期望的效果。但是 PasswordPropertyTextAttribute
似乎没有任何效果。有没有其他方法可以使文本屏蔽与基本的 属性-基于网格的选项页面一起使用?或者我是否需要制作自定义选项 UI 表单来获取文本屏蔽?
其次,我如何确保密码字段值以合理安全的方式保存在磁盘上,类似于其他需要存储用户凭据的软件?对于我的需要,我认为使用当前用户帐户的 Windows DPAPI 保护就足够了,但我不确定如何使用它来保护 MyPackageOptions.Password
属性 .
要使 PasswordPropertyTextAttribute
生效,必须通过将其 Password
属性 设置为 true
来“打开”它。如果使用默认构造函数,则 Password
属性 为 false
并且该属性无效。
使其工作的最简单方法是使用 [PasswordPropertyText(true)]
行而不是 [PasswordPropertyText]
行将属性添加到 属性 以调用适当的 non-default构造函数。
可以通过覆盖 DialogPage
LoadSettingsFromStorage
, SaveSettingsToStorage
, LoadSettingsFromXml
, and SaveSettingsToXml
methods as described in
实现自定义 TypeConverter
来处理 encryption/decryption(类似于 this approach)没有用,因为相同的 TypeConverter
用于转换 to/from PropertyGrid
中的字符串值,以及在 Visual Studio 注册表或 XML 导出中保留值时。因此,如果转换器可以处理 PropertyGrid 中的纯文本输入,那么当对象保存到存储或导出到 XML.