WPF PasswordBox& SecureString:不能MakeReadOnly()?

时间:2012-11-20 20:22:37

标签: c# .net wpf passwordbox securestring

是否可以将PasswordBox.SecurePassword标记为ReadOnly

考虑这个简单的代码:

XAML:

<StackPanel>
    <PasswordBox Name="pBox" MinWidth="100" />
    <Button Content="OK" Click="Button_Click" Width="50" />
</StackPanel>

C#:

private void Button_Click(object sender, RoutedEventArgs e)
{
    pBox.SecurePassword.MakeReadOnly();
    Console.WriteLine(pBox.SecurePassword.IsReadOnly());
}

它将输出False。为什么呢?

编辑:为了确保,我尝试了这个并按预期输出“True”。

private void Button_Click(object sender, RoutedEventArgs e)
{
    SecureString s = new SecureString();
    s.MakeReadOnly();
    Console.WriteLine(s.IsReadOnly());
}

1 个答案:

答案 0 :(得分:1)

每次阅读该属性时,

pBox.SecurePassword都会返回一个新的安全字符串实例。您可以多次在GetHashCode上致电pBox.SecurePassword来验证它。

您还会注意到使用Visual Studios“Make object id”不会显示#X,因为每次使用鼠标悬停时都会显示一个新实例。

在将SecureString对象创建引用到局部变量时, 与您调用MakeReadOnly()的实例相同,因此它的行为符合预期。