我应该如何坚持CredentialPickerResults.Credential for CredentialPickerOptions.PreviousCredential?

时间:2013-02-27 07:09:19

标签: windows-8

我想使用CredentialPicker来提示输入用户名和密码。配置此类的实例时,我可以将CredentialPickerOptions.PreviousCredential设置为先前由CredentialPickerResults.Credential获取的值。我相信这会导致对话框预先填充凭证。

然而,坚持这个价值似乎并非无足轻重;它是IBuffer,其成员似乎不包含相关凭据。 Programming Windows 8 Apps with HTML, CSS, and JavaScript,第657页,暗示这应该是可能的:

  

包含凭证作为不透明字节数组的IBuffer。这就是你能做到的   如果需要,保存在你自己的持久状态,并在以后传回给选择器;好   看看有多快。

不幸的是,我们会看到似乎很快就会引用这个值可以将从内存传递回PreviousCredential;我没有发现它是如何存在的。

另外,我想使用推荐的方法保留凭据,我认为这是使用PasswordVault,但是,这似乎只允许我将凭据保存为用户名和密码字符串而不是IBuffer。

1 个答案:

答案 0 :(得分:3)

感谢您花时间提问,我当然同意我可以在本书的那一部分中更清楚。不可否认,我在第14章上花的时间比我想要的少,但我会在下一版中尝试解决这个问题。像你这样的反馈在知道我需要改进的地方非常有价值,所以我很感激。

无论如何,将缓冲区写入文件是第8章中提到的(在这里可能会再次提到......第325页,尽管它没有明确提到IBuffer)。使用Windows.Storage.FileIO类是一项简单的工作,如下所示(承诺!)。

首先,澄清一下。您有两种方法可以保存输入的凭据。如果要保存纯文本凭据,请绝对使用凭证锁。这样做的好处是,如果在PC设置中启用了漫游密码,则这些凭据可以自动漫游用户(默认情况下)。否则,您可以将不透明的CredentialPickerResults.credential属性直接保存到文件中。它已经加密和加密,所以在这种情况下你不需要使用凭证锁。

现在用于保存/加载凭证属性,即IBuffer。为此,您使用FileIO.writeBufferAsync保存并重新加载FileIO.readBufferAsync。

我修改了Credential Picker示例,方案3来演示这一点。为了保存凭证属性,我在pickAsync的完成处理程序的末尾添加了这段代码:

//results.credential will be null if the user cancels
if (results.credential != null) {
    //Having retrieved a credential, write the opaque buffer to a file
    var option = Windows.Storage.CreationCollisionOption.replaceExisting;

    Windows.Storage.ApplicationData.current.localFolder.createFileAsync("credbuffer.dat", option).then(function (file) {
        return Windows.Storage.FileIO.writeBufferAsync(file, results.credential);
    }).done(function () {
        //No results for this operation
        console.log("credbuffer.dat written.");
    }, function (e) {
        console.log("Could not create credbuffer.dat file.");
    });
}

然后我创建了一个新功能来加载该凭证,如果可能的话。这是在Launch按钮单击而不是launchCredPicker上调用的:

//In the page ready method:
document.getElementById("button1").addEventListener("click", readPrevCredentialAndLaunch, false);


//Added
function readPrevCredentialAndLaunch() {
    Windows.Storage.ApplicationData.current.localFolder.getFileAsync("credbuffer.dat").then(function (file) {
        return Windows.Storage.FileIO.readBufferAsync(file);
    }).done(function (buffer) {
        console.log("Read from credbuffer.dat");
        launchCredPicker(buffer);
    }, function (e) {
        console.log("Could not reopen credbuffer.dat; launching default");
        launchCredPicker(null);
    });
}

//Modified to take a buffer
function launchCredPicker(prevCredBuffer) {    
    try {
        var options = new Windows.Security.Credentials.UI.CredentialPickerOptions();

        //Other options omitted

        if (prevCredBuffer != null) {
            options.previousCredential = prevCredBuffer;
        }

    //...

就是这样。我将修改后的JS样本放在http://www.kraigbrockschmidt.com/src/CredentialPickerJS_modified.zip上。

.Kraig

作者, Programming Windows 8 Apps in HTML, CSS, and JavaScript (免费电子书)