2013-02-27 48 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