2

我想使用 aCredentialPicker来提示输入用户名和密码。当我配置这个类的一个实例时,我可以设置CredentialPickerOptions.PreviousCredential为以前通过CredentialPickerResults.Credential. 我相信这会导致对话框预填充凭据。

但是,保持这个值似乎并不简单。它是一个IBuffer,其成员似乎不包含相关凭据。使用 HTML、CSS 和 JavaScript 编程 Windows 8 应用程序,第 657 页,暗示这应该是可能的:

包含凭证的IBuffer不透明字节数组。如果需要,您可以将其保存在自己的持久状态中,并在以后传递回选择器;我们很快就会看到。

不幸的是,我们很快就会看到,它似乎只是指该值可以从内存中传回PreviousCredential;的事实。我没有发现任何关于它是如何持续存在的提及。

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

4

1 回答 1

3

感谢您花时间提问,我当然同意我可以在本书的那部分更清楚。诚然,我花在第 14 章上的时间比我希望的要少,但我会在下一版中尝试弥补这一点。像您这样的反馈对于了解我需要改进的地方非常有价值,所以我很感激。

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

首先,澄清一下。您有两种方法可以保存输入的凭据。如果要保存纯文本凭据,请绝对使用 Credential Locker。这样做的好处是,如果在 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上。

.克雷格

作者,用 HTML、CSS 和 JavaScript 编写 Windows 8 应用程序(免费电子书)

于 2013-02-28T05:54:38.413 回答