Windows 8のストア アプリでとりあえずパスワードを保存する

Windows ストア アプリでパスワードなどの認証情報を保存するには、Windows.Security.Credentials名前空間PasswordVaultクラスを使うのが良いようです。いまいち情報が少ないのですが、名前空間の要旨には以下のように記述があります。

[※引用(意訳)]

"Provides a common way to securely store and manage your passcodes, passphrases, and other identification information." (パスコード、パスフレーズ、その他認証情報などを安全に保存・管理する共通の方法を提供します。)

PasswordVaultクラスには認証情報の保存や保存された認証除法を取り出すなどの一通りのメソッドが提供されており、認証情報は同じくWindows.Security.Credentials名前空間PasswordCredentialクラスによって定義されます。

PasswordCredential passwordCredential = new PasswordCredential([リーソース], [ユーザ名], [パスワード])

リソースには、実行しているアプリケーションを識別できる文字列を指定します。例えば現在実行しているアプリケーションに関連するすべてのユーザの認証情報を取得する場合、このリソースが認証情報を検索するためのキーになります。

例:

PasswordCredential passwordCredential = new PasswordCredential("my_application", "guest", "password")

認証情報のシステムへの保存

PasswordVault.Addメソッドでシステムに認証情報を保存することができます。

PasswordVault passwordVault = new PasswordVault();
passwordVault.Add(new PasswordCredential("my_application", "guest", "password"));

認証情報のシステムからの取得

PasswordVault.Retrieveメソッドによってシステムから特定のアプリケーションの特定のユーザーの認証情報を取得することができます。戻り値はPasswordCredentialクラスですが、注意が必要なのはもし該当する認証情報が見つからなかった場合、戻り値がNullになるのではなく例外が発生します。個人的にはNullが戻ったほうが使い勝手が良い気がするのですが・・・。

PasswordVault passwordVault = new PasswordVault();
try
{
	var credential = passwordVault.Retrieve("my_application", "guest");
}
catch (Exception ex)
{
	//パスワードが見つからなかった場合の処理
}

その他に認証情報を取得するメソッドとして、PasswordVault.RetrieveAllメソッド(保存されているすべての認証情報を取得)、PasswordVault.FindAllByResourceメソッド(あるアプリケーションのすべてのユーザの認証情報リストを取得)、PasswordVault.FindAllByUserNameメソッド(あるユーザーのすべてのアプリケーションの認証情報リストを取得)が提供されています。

認証情報のシステムからの削除

PasswordVault.Removeメソッドを使用してシステムからパスワードを削除できます。手順としては前述した認証情報の取得によって得た認証情報取得しメソッドの引数に渡します。

PasswordVault passwordVault = new PasswordVault();
try
{
	var credential = passwordVault.Retrieve("my_application", "guest");
	passwordVault.Remove(credential);
}
catch (Exception ex)
{
	//パスワードが見つからなかった場合の処理
}

なかなかきちんと情報収集できていないのでまだ有効活用できてる感が無いのですが、とりあえず使った限りではシステムに認証情報管理を丸投げできるので便利だなぁと思います。