2013-02-27 45 views
2

我想用CredentialPicker提示输入用户名和密码。当我配置此类的实例时,我可以将CredentialPickerOptions.PreviousCredential设置为之前通过CredentialPickerResults.Credential获得的值。我相信这会导致对话框预先填充证书。如何为CredentialPickerOptions.PreviousCredential保留CredentialPickerResults.Credential?

但是,坚持这个值似乎是不平凡的;这是一个IBuffer,其成员似乎不包含相关凭证。 Programming Windows 8 Apps with HTML, CSS, and JavaScript,657页,意味着这应该是可能的:

IBuffer一种含有所述凭证作为不透明字节数组。这是你可以保存在你自己的持久状态,如果需要的话,稍后再传递给选择器;我们将 看到如何很快。

不幸的是,我们将看到如何出现不久,仅涉及事实值可以传递回从内存PreviousCredential;我没有发现它是如何持续下去的。

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

回答

3

感谢您花时间提问,我当然同意我可以在本书的这一部分更加清楚。无可否认,我在第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(免费的电子书)

+0

感谢您抽出宝贵时间来回答!对我而言,理想的做法是将用户名和密码保存在凭证柜中。这样,我认为用户可以查看他们,如果他们忘记了他们,并且如您所说,这可能会导致漫游。但是,我找不到任何方式将纯文本凭据传递给'CredentialPicker',以便可以用它们预填充字段。你知道如何做到这一点? – Sam 2013-02-28 09:18:11

+1

好的说明。要在证书选取器的调用之间持续使用凭据,请使用缓冲区(并将其漫游,然后将其保存在漫游文件夹中而不是本地)。要坚持其他证书,请使用凭证储物柜。这些不是相互排斥的 - 用于不同目的的不同方法。请注意,您可以使用alwaysDisplayDialog调用凭据选择器为false,我相信您可以让它解密缓冲区并返回纯文本凭证。在这种情况下,您不需要使用凭证储物柜。 – 2013-02-28 14:57:26

+0

非常感谢您的帮助! – Sam 2013-02-28 20:49:55