資格情報保管ボックス: Windows ストア アプリのユーザー名とパスワード処理のソリューション
Windows ストア アプリで使用できる資格情報保管ボックスついてご存知なければ、ここでぜひ知っておいてください。理由は、資格情報保管ボックスを使うと、ユーザー資格情報の格納と取得の作業を簡略化できるだけでなく、資格情報を安全に格納でき、ユーザーの Microsoft アカウントと合わせて "無料で" ローミングできるからです。
たとえば、メディア ファイルやソーシャル ネットワークなど、保護されたリソースにアクセスするサービスに接続するアプリがあるとします。サービスを利用するには、ユーザーごとにログイン情報が必要です。そこで、ユーザーのユーザー名とパスワードを取得し、それを使ってサービスにユーザーをログインする UI をアプリに組み込みました。すべてがスムーズに機能しています。
今度はさらに、ユーザーの利便性を考えて、アプリを使うたびにログインしなくても済むようにログイン情報を安全に格納したいと考えました。そこで、資格情報保管ボックスの出番です。資格情報保管ボックス API を何回か呼び出すだけで、ユーザーのユーザー名とパスワードを格納し、ユーザーが次にアプリを開くときに、簡単に格納した情報を取得して、自動でユーザーのログインを処理できます。
安全な保存スペース
アプリにとっての資格情報保管ボックスの最大のメリットは、ユーザー資格情報が安全な場所に格納されることです。資格情報は、ディスク上に格納されるとき、暗号化されます。もちろん、アプリに使うユーザー資格情報をファイルに保存してローカルの保存スペースに格納することもできますが、ユーザー資格情報をプレーンテキストで格納すると、大きなセキュリティ ホールになります。ユーザーのシステムが何かの形で侵害された場合、ユーザーのユーザー名とパスワードにアクセスして操作することは簡単です。ユーザー名とパスワードが資格情報保管ボックスを使って格納されていれば、悪意のあるソースは暗号化されたファイルを入手するのが関の山です。
資格情報保管ボックスは各 Windows PC ユーザーに一意であり、資格情報を格納したアプリしか、その資格情報にアクセスできません。つまり、その特定のアプリのために格納した資格情報以外は取得できません。同様に、他のアプリは、この特定のアプリによって資格情報保管ボックスに格納されている資格情報にはアクセスできません。
資格情報のローミング
ユーザーに提供できるもう 1 つのメリットは、資格情報保管ボックスを使ってユーザー名とパスワードを格納すると、格納された資格情報はユーザーの Microsoft アカウントと共に、ユーザーがその Microsoft アカウントを使う限りどの信頼済みコンピューターにもローミングされることです。その結果、ユーザーの Microsoft アカウントに関連付けられていて、アプリがインストールされていれば、どの信頼済みコンピューターからでも、ユーザーはアプリに自動的にログインできる (ユーザーに資格情報の入力が求められない) ため、セキュリティで保護されたアプリはユーザーにとってさらに便利なものになります。
ドメイン アカウントの場合は、処理が少し異なります。Microsoft アカウントを使って格納されている資格情報があり、そのアカウントをドメイン アカウント (仕事で使うアカウントなど) に関連付けている場合、資格情報はそのドメイン アカウントにローミングされます。ただし、そのドメイン アカウント使ってサイン オンするときに追加された新しい資格情報は、ローミングされません。これにより、そのドメイン固有の資格情報が、ドメイン外部に知られないようにしています。
ユーザー資格情報の格納
資格情報保管ボックスへのユーザー資格情報の格納は、簡単な 2 ステップのプロセスです。最初に、Windows.Security.Credentials 名前空間の PasswordVault オブジェクトを使って、資格情報保管ボックスへの参照を取得します。次に、アプリの識別子、ユーザー名およびパスワードを保持する PasswordCredential オブジェクトを作成し、このオブジェクトを PasswordVault.Add() メソッドに渡して、資格情報を資格情報保管ボックスに追加します。
C#
var vault = new Windows.Security.Credentials.PasswordVault(); vault.Add(new Windows.Security.Credentials.PasswordCredential( "My App", username, password));
JavaScript
var vault = new Windows.Security.Credentials.PasswordVault(); vault.add(new Windows.Security.Credentials.PasswordCredential( "My App", username, password));
ユーザー資格情報の取得
PasswordVault オブジェクトの参照を取得したら、資格情報保管ボックスからユーザー資格情報を取得する方法はいくつかあります。
- PasswordVault.RetrieveAll() メソッドを使うと、ユーザーがアプリ用に資格情報保管ボックスに格納している資格情報をすべて取得できます。
- 格納されている資格情報のユーザー名がわかっている場合は、PasswordVault.FindAllByUserName() メソッドを使って、そのユーザー名の資格情報をすべて取得できます。
- 格納されている資格情報のリソース名がわかっている場合は、PasswordVault.FindAllByResource() メソッドを使って、そのリソース名の資格情報をすべて取得できます。
- 資格情報のユーザー名とリソース名がわかっている場合は、PasswordVault.Retrieve() メソッドを使って、その資格情報のみを取得できます。
では、リソース名がグローバルにアプリに格納されていて、ユーザーの資格情報を見つけることができた場合、自動的にユーザーがログインできるサンプルを見てみましょう。ユーザーの資格情報が複数見つかった場合は、ログオン時に使用する既定の資格情報を選択するようにユーザーに求めます。
C#
private string resourceName = "My App"; private string defaultUserName; private void 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); } private Windows.Security.Credentials.PasswordCredential GetCredentialFromLocker() { Windows.Security.Credentials.PasswordCredential credential = null; var vault = new Windows.Security.Credentials.PasswordVault(); var credentialList = vault.FindAllByResource(resourceName); if (credentialList.Count > 0) { if (credentialList.Count == 1) { credential = credentialList[0]; } else { // When there are multiple usernames, // retrieve the default username. If one doesn’t // exist, then display UI to have the user select // a default username. defaultUserName = GetDefaultUserNameUI(); credential = vault.Retrieve(resourceName, defaultUserName); } } return credential; }
JavaScript
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; }
ユーザー資格情報の削除
資格情報保管ボックスへのユーザー資格情報の削除も、簡単な 2 ステップのプロセスです。この場合も、Windows.Security.Credentials 名前空間の PasswordVault オブジェクトを使って、資格情報保管ボックスへの参照を取得します。次に、削除する資格情報を PasswordVault.Remove() メソッドに渡します。
C#
var vault = new Windows.Security.Credentials.PasswordVault(); vault.Remove(new Windows.Security.Credentials.PasswordCredential( "My App", username, password));
JavaScript
var vault = new Windows.Security.Credentials.PasswordVault(); vault.remove(new Windows.Security.Credentials.PasswordCredential( "My App", username, password));
簡単で安全
このように、資格情報保管ボックスは、より簡単に、しかも非常に安全に、ユーザーを認証し、ユーザーの資格情報を将来再利用する目的で格納できる、使いやすい機能です。
その他の Windows 8 アプリの認証に関するトピックには、Web サイトからの認証トークン (OAuth など) の取得に使用できる Web 認証ブローカーや、ユーザーの Microsoft アカウントを基にしたアプリのカスタマイズがあります。
詳細については、以下のリンクをご覧ください。
- ユーザー情報の管理 (JavaScript)
- ユーザー情報の管理 (C#/VB/C++ と XAML を使った Windows ストア アプリ)
- 資格情報保管ボックスのサンプル (英語)
- Windows.Security.Credentials
--Doug Rothaus、Windows 開発者コンテンツ チーム、シニア コンテンツ開発者
今回の記事作成にあたっては、Yashar Bahman 氏にご協力いただきました。ありがとうございました。