Xamarin Essentials Secure Storage 是否可要求用户认证才可访问存储内容?
问题结论
你没有遗漏相关功能,Xamarin Essentials 官方封装的 Secure Storage 组件未公开访问控制等级的自定义配置入口,要实现仅用户认证后才可访问存储内容的需求,需要自行编写平台特定代码实现。
底层逻辑说明
- iOS端:Xamarin Essentials 内置的 Secure Storage 硬编码使用了
SecAccessible.AfterFirstUnlockThisDeviceOnly作为默认的Keychain访问等级,不支持外部传入自定义枚举值 - Android端:内置实现生成KeyStore密钥时未开启
setUserAuthenticationRequired(true)配置,默认不需要用户认证即可访问存储内容
实现方案
推荐通过 Xamarin Dependency Service 实现跨平台调用的自定义安全存储服务,步骤如下:
- 共享项目中定义服务接口
public interface ICustomSecureStorage { /// <summary> /// 存储加密数据 /// </summary> /// <param name="key">存储键名</param> /// <param name="value">存储值</param> /// <param name="requireUserAuth">是否要求用户认证后才可访问</param> Task SetAsync(string key, string value, bool requireUserAuth = false); /// <summary> /// 读取加密数据 /// </summary> Task<string> GetAsync(string key); /// <summary> /// 删除存储数据 /// </summary> bool Remove(string key); }
iOS平台实现
直接操作系统Keychain,可自定义传入SecAccessible枚举值,当设置WhenPasscodeSetThisDeviceOnly时,若用户未设置设备锁,存储操作会抛出异常,可自行捕获处理。Android平台实现
操作系统KeyStore生成加密密钥,开启setUserAuthenticationRequired(true)配置即可实现用户认证要求,注意该配置仅支持Android 6.0及以上系统,低版本系统可根据业务需求选择降级处理或抛出不支持提示。跨平台调用示例
try { var secureStorage = DependencyService.Get<ICustomSecureStorage>(); await secureStorage.SetAsync("oauth_token", "secret-oauth-token-value", requireUserAuth: true); } catch (Exception ex) { // 设备未设置锁、系统版本不支持、用户取消认证等异常处理 }
补充说明
如果不想完全重写安全存储逻辑,也可直接修改Xamarin Essentials开源库中SecureStorage的平台实现代码,将硬编码的访问配置改为可传入参数,但该方案会影响后续官方版本的升级兼容性,不推荐使用。
内容的提问来源于stack exchange,提问作者Vering
相关产品推荐
相关产品推荐

