我想使用CredentialPicker
来提示输入用户名和密码。配置此类的实例时,我可以将CredentialPickerOptions.PreviousCredential
设置为先前由CredentialPickerResults.Credential
获取的值。我相信这会导致对话框预先填充凭证。
然而,坚持这个价值似乎并非无足轻重;它是IBuffer
,其成员似乎不包含相关凭据。 Programming Windows 8 Apps with HTML, CSS, and JavaScript,第657页,暗示这应该是可能的:
包含凭证作为不透明字节数组的
IBuffer
。这就是你能做到的 如果需要,保存在你自己的持久状态,并在以后传回给选择器;好 看看有多快。
不幸的是,我们会看到似乎很快就会引用这个值可以将从内存传递回PreviousCredential
;我没有发现它是如何存在的。
另外,我想使用推荐的方法保留凭据,我认为这是使用PasswordVault
,但是,这似乎只允许我将凭据保存为用户名和密码字符串而不是IBuffer。
答案 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 (免费电子书)