使用認證保險箱儲存使用者認證 (HTML)
[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]
「認證保險箱」可簡化安全地儲存和擷取使用者認證的工作,並可讓使用者認證隨使用者的 Microsoft 帳戶免費漫遊。
假設您有一個應用程式會連線至服務以存取受保護的資源 (如媒體檔案及社交網路等)。您的服務需要每個使用者的登入資訊。因此,您在應用程式中已經建立能取得使用者的使用者名稱及密碼的 UI,之後會使用這些資訊將使用者登入服務。一切的運作都很流暢。
現在您想為使用者提供更多服務,並且安全地儲存他們的登入資訊,這樣他們在使用您的應用程式時就不需要每次登入。輸入認證保險箱。您只要對認證保險箱 API 進行一些簡單呼叫,就能儲存並輕鬆地擷取使用者的使用者名稱與密碼,並在使用者下次開啟您的應用程式時將他們登入。
安全存放裝置
認證保險箱帶給您的應用程式最大的好處是它可將使用者認證儲存在安全的位置,而且認證資訊儲存在磁碟上時會加密。您當然可以將使用者認證儲存在應用程式本機存放裝置的檔案中,但是以純文字儲存使用者認證存在相當大的安全漏洞。如果使用者系統遭到某種方式的入侵,即可輕易取得和竄改使用者的使用者名稱與密碼。如果使用者名稱與密碼是使用認證保險箱儲存,惡意使用者最多只能取得加密檔案。
漫遊認證
使用者可獲得的另一項附帶好處是,當您使用認證保險箱儲存他們的使用者名稱與密碼時,儲存的認證會隨他們的 Microsoft 帳戶漫遊到其他使用該 Microsoft 帳戶來操作的所有信任機器。對於使用者來說,這使得您的安全應用程式在使用上更為便利,因為應用程式可自動從已安裝應用程式且已將 Microsoft 帳戶關聯的所有信任的機器將他們登入 - 不需重新提示使用者輸入認證。
網域帳戶的運作方式有些不同。如果有隨您的 Microsoft 帳戶儲存的認證,而您將該帳戶與網域帳戶 (例如您的工作帳戶) 關聯,則您的認證會漫遊至該網域帳戶。但使用該網域帳戶登入時所新增的任何新認證則不會漫遊。這樣可確保網域的私密認證不會暴露到網域外。
技術
指示
步驟 1: 儲存使用者認證
將使用者認證儲存在認證保險箱是一個快速的雙步驟程序。
- 使用 Windows.Security.Credentials 命名空間中的 PasswordVault 物件取得認證保險箱的參考。
- 建立一個包含您的應用程式識別碼、使用者名稱及密碼的 PasswordCredential 物件,並將它傳送到 PasswordVault.Add 方法以在保險箱新增認證。
var vault = new Windows.Security.Credentials.PasswordVault();
vault.add(new Windows.Security.Credentials.PasswordCredential(
"My App", username, password));
步驟 2: 擷取使用者認證
在具備 PasswordVault 物件的參考後,您有幾個選項可從認證保險箱擷取使用者認證。
您可以使用 PasswordVault.RetrieveAll 方法來擷取保險箱中使用者為您的應用程式提供的所有認證。
如果您知道所儲存認證的使用者名稱,您可以使用 PasswordVault.FindAllByUserName 方法來擷取該使用者名稱的所有認證。
如果您知道所儲存認證的資源名稱,您可以使用 PasswordVault.FindAllByResource 方法來擷取該資源名稱的所有認證。
最後,如果您知道某個認證的使用者名稱與資源名稱,您可以使用 PasswordVault.Retrieve 方法來擷取該認證。
請看以下範例,在此範例中,我們將資源名稱以全域方式儲存在應用程式中,如果我們找到使用者的認證,就會自動將使用者登入。如果我們找到使用者的多個認證,則會要求使用者選取登入時要使用的預設認證。
var resourceName = "My App";
var defaultUserName;
function login() {
var loginCredential = getCredentialFromLocker();
if (loginCredential != null) {
// There is a credential stored in the locker.
// Populate the Password property of the credential
// for automatic login.
loginCredential.retrievePassword();
} else {
// There is no credential stored in the locker.
// Display UI to get user credentials.
loginCredential = getLoginCredentialUI();
}
// Log the user in.
serverLogin(loginCredential.userName, loginCredential.password);
}
function GetCredentialFromLocker() {
var credential = null;
var vault = new Windows.Security.Credentials.PasswordVault();
var credentialList = vault.findAllByResource(resourceName);
if (credentialList.length > 0) {
if (credentialList.length == 1) {
credential = credentialList[0];
} else {
// When there are multiple usernames,
// retrieve the default username. If one doesn’t
// exist, display UI to have the user select
// a default username.
defaultUserName = getDefaultUserNameUI();
credential = vault.retrieve(resourceName, defaultUserName);
}
}
return credential;
}
步驟 3: 刪除使用者認證
刪除儲存在認證保險箱的使用者認證也是一個快速的雙步驟程序。
使用 Windows.Security.Credentials 命名空間中的 PasswordVault 物件取得認證保險箱的參考。
將您想刪除的認證傳送到 PasswordVault.Remove 方法。
var vault = new Windows.Security.Credentials.PasswordVault();
vault.remove(new Windows.Security.Credentials.PasswordCredential(
"My App", username, password));
備註
如您所見,認證保險箱是一項易於使用的功能,可以簡化驗證使用者與儲存使用者認證的工作,而且都是以高度安全的方式實行。
最佳做法
僅使用認證保險箱來儲存密碼,不要儲存較大的資料 blob。
只在符合下列條件時才會將密碼儲存至認證保險箱:
- 使用者已成功登入過。
- 使用者已選擇儲存密碼。