You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Essentials Secure Storage 是否可要求用户认证才可访问存储内容?

问题结论

你没有遗漏相关功能,Xamarin Essentials 官方封装的 Secure Storage 组件未公开访问控制等级的自定义配置入口,要实现仅用户认证后才可访问存储内容的需求,需要自行编写平台特定代码实现。

底层逻辑说明
  • iOS端:Xamarin Essentials 内置的 Secure Storage 硬编码使用了 SecAccessible.AfterFirstUnlockThisDeviceOnly 作为默认的Keychain访问等级,不支持外部传入自定义枚举值
  • Android端:内置实现生成KeyStore密钥时未开启 setUserAuthenticationRequired(true) 配置,默认不需要用户认证即可访问存储内容
实现方案

推荐通过 Xamarin Dependency Service 实现跨平台调用的自定义安全存储服务,步骤如下:

  1. 共享项目中定义服务接口
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);
}
  1. iOS平台实现
    直接操作系统Keychain,可自定义传入SecAccessible枚举值,当设置WhenPasscodeSetThisDeviceOnly时,若用户未设置设备锁,存储操作会抛出异常,可自行捕获处理。

  2. Android平台实现
    操作系统KeyStore生成加密密钥,开启setUserAuthenticationRequired(true)配置即可实现用户认证要求,注意该配置仅支持Android 6.0及以上系统,低版本系统可根据业务需求选择降级处理或抛出不支持提示。

  3. 跨平台调用示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:15:03