感谢您花时间提问,我当然同意我可以在本书的这一部分更加清楚。无可否认,我在第14章花费的时间比我想要的少,但我会在下一版中尝试弥补这一点。像你这样的反馈在知道我需要改进的地方是非常有价值的,所以我很感激它。
无论如何,写一个缓冲区到文件是在第8章中提到过的(可能在这里再次提到......第325页,尽管它没有明确提到IBuffer)。使用Windows.Storage.FileIO类是一个简单的工作,如下所示(promise!)。
首先澄清。您有两种方法来保存输入的凭证。如果您想保存纯文本凭据,那么绝对使用凭证锁定器。这样做的好处是,如果在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.");
});
}
然后,我创建了一个新的功能来加载证书,如果可能的话。这是在启动按钮单击而不是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(免费的电子书)
感谢您抽出宝贵时间来回答!对我而言,理想的做法是将用户名和密码保存在凭证柜中。这样,我认为用户可以查看他们,如果他们忘记了他们,并且如您所说,这可能会导致漫游。但是,我找不到任何方式将纯文本凭据传递给'CredentialPicker',以便可以用它们预填充字段。你知道如何做到这一点? – Sam 2013-02-28 09:18:11
好的说明。要在证书选取器的调用之间持续使用凭据,请使用缓冲区(并将其漫游,然后将其保存在漫游文件夹中而不是本地)。要坚持其他证书,请使用凭证储物柜。这些不是相互排斥的 - 用于不同目的的不同方法。请注意,您可以使用alwaysDisplayDialog调用凭据选择器为false,我相信您可以让它解密缓冲区并返回纯文本凭证。在这种情况下,您不需要使用凭证储物柜。 – 2013-02-28 14:57:26
非常感谢您的帮助! – Sam 2013-02-28 20:49:55