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,因此无法从此类任务中调用。两种方法都可以。