Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 8 我应该如何持久化CredentialPickerResults.Credential for CredentialPickerOptions.PreviousCredential?_Windows 8 - Fatal编程技术网

Windows 8 我应该如何持久化CredentialPickerResults.Credential for CredentialPickerOptions.PreviousCredential?

Windows 8 我应该如何持久化CredentialPickerResults.Credential for CredentialPickerOptions.PreviousCredential?,windows-8,Windows 8,我想使用CredentialPicker提示输入用户名和密码。配置此类的实例时,我可以将CredentialPickerOptions.PreviousCredential设置为以前通过CredentialPickerResults.Credential获得的值。我相信这会导致对话框预填充凭据 然而,坚持这个值似乎是非常重要的;这是一个IBuffer,其成员似乎不包含相关凭据,第657页,暗示这应该是可能的: 一个IBuffer,包含作为不透明字节数组的凭证。这就是你能做的 如果需要,以自己的持

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

然而,坚持这个值似乎是非常重要的;这是一个
IBuffer
,其成员似乎不包含相关凭据,第657页,暗示这应该是可能的:

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

不幸的是,我们将看到,在很短的时间内,该值只能从内存传回到
PreviousCredential
;我没有发现任何关于它是如何持续存在的


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

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

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

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

现在保存/加载凭证属性,它是一个IBuffer。为此,请使用FileIO.writeBufferAsync保存,并使用FileIO.readBufferAsync重新加载

为了演示这一点,我修改了场景3中的凭证选择器示例。为了保存credential属性,我在完成的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.");
    });
}
然后,如果可能的话,我创建了一个新函数来加载该凭证。这是在启动按钮单击时调用的,而不是启动CredPicker:

//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示例放在了桌面上

克雷格先生


作者,(免费电子书)

感谢您抽出时间回答!对我来说,理想的做法是将用户名和密码保存在凭证储物柜中。通过这种方式,我认为用户可以在忘记它们的情况下查看它们,正如您所说的,这可以实现漫游。但是,我找不到任何方法将纯文本凭据传递给
CredentialPicker
,以便它可以预先填充字段。你知道怎么做吗?很好的澄清。要在调用凭证选择器之间持久保存凭证,请使用缓冲区(要漫游它,您需要将其保存在漫游文件夹中,而不是本地文件夹中)。若要保留凭据,请使用凭据锁。这些并不是相互排斥的——不同的方法用于不同的目的。请注意,您可以使用alwaysDisplayDialog将凭证选择器调用为false,我相信这允许您让它解密缓冲区并返回纯文本凭证。在这种情况下,您不需要使用凭证储物柜。非常感谢您的帮助!我刚刚尝试在后台任务中解码
IBuffer
,但我收到了
ArgumentException
。我怀疑我需要从UI线程进行解码。我可以通过将缓冲区保存到文件中,并将凭据保存到凭据锁中来解决此问题。听起来合理吗?是的,合理。您无法在后台任务中使用凭据选择器解码错误,因为它是一个UI API,因此无法从此类任务中调用。两种方法都可以。