Локальное хранилище — неподходящее место для хранения токенов. Но в этом сообщении в блоге говорится, что LocalCache, как правило, является правильным местом. Если я храню в LocalCache с использованием DPAPI, достаточно ли это безопасно?
Является ли PasswordVault подходящим местом для его хранения?
Как я могу безопасно хранить токен, чтобы токен этого приложения был недоступен?
Где безопасно хранить токен доступа в приложении UWP?
Как правило, мы часто храним токен доступа с классом ApplicationData.LocalSettings, который размещает контейнер настроек в локальном хранилище данных приложения. Вы можете использовать его следующим образом.
var localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
// Create a simple setting.
localSettings.Values["accesstoken"] = token;
// Read data from a simple setting.
Object value = localSettings.Values["accesstoken"];
if (value == null)
{
// No data.
}
else
{
// Access data in value.
}
И если вы хотите безопасно хранить токен доступа. Среда выполнения Windows предоставляет класс PasswordVault
для безопасного хранения учетных данных. для получения дополнительной информации обратитесь к этому документу.
Я определенно рекомендую хранить конфиденциальную информацию, такую как токен доступа, в PasswordVault
, поскольку LocalSettings
не зашифрованы и легко доступны из папки пакета приложения в AppData
.
Хотя у PasswordVault
немного странный API, вы все равно можете легко использовать его для хранения токена:
var passwordVault = new PasswordVault();
passwordVault.Add(new PasswordCredential("Resource", "UserName", accessToken));
В вашем случае вас, скорее всего, интересует только токен доступа, поэтому «ресурс» и «имя пользователя» могут быть просто произвольными константами. Получить токен также легко:
//find credentials in the store
PasswordCredential? credential = null;
try
{
// Try to get an existing credential from the vault.
credential = _passwordVault.Retrieve("Resource", "UserName");
}
catch (Exception)
{
// When there is no matching resource an error occurs, which we ignore.
}
credential?.RetrievePassword();
return credential?.Password;
Обратите внимание на использование try..catch
. Это связано с тем, что хранилище сбрасывается, если заданная комбинация имени ресурса/пользователя не найдена (что может даже произойти, когда пользователь вручную удаляет запись в системном диспетчере учетных данных.
Еще одно преимущество PasswordVault
заключается в том, что учетные данные синхронизируются между устройствами (хотя эта функция может исчезнуть в будущих версиях).
Если вы сохраните токен с помощью LocalSettings, он будет храниться в локальных данных приложения, он недоступен снаружи.