Xamarin iOS模拟器登录时TokenCache抛出异常 安卓及UWP运行正常
异常场景
- 触发环境:Xamarin跨平台应用iOS模拟器端登录流程
- 抛出异常:
Microsoft.identitymodel.clients.activedirectory.tokencache threw an exception - 对照验证结果:同一份代码在安卓模拟器、UWP平台登录功能运行正常,无同类报错
根因定位与修复方案
该异常仅在iOS端触发,核心原因基本都和ADAL(Active Directory Authentication Library)在iOS平台的令牌缓存实现逻辑有关,安卓、UWP的缓存存储机制与iOS存在本质差异,因此不会触发同类问题,按优先级排查如下:
- 钥匙串访问权限未正确配置(占该类问题90%以上)
ADAL在iOS平台默认将认证令牌持久化存储在系统钥匙串中,若应用未声明对应权限,读写缓存时会直接抛出TokenCache异常。
修复操作:- 打开iOS项目下的
Entitlements.plist,开启Keychain Access Groups能力 - 在访问组列表新增条目:
$(AppIdentifierPrefix)+你的应用Bundle ID,例如$(AppIdentifierPrefix)com.demo.myxamarinapp - 进入iOS项目属性的「iOS Bundle Signing」配置页,确认Debug/Release两个配置下,Custom Entitlements字段都关联了已修改的
Entitlements.plist文件——多数开发者漏配Debug模式连模拟器的授权配置,导致调试时持续报错。
- 打开iOS项目下的
- iOS模拟器系统兼容bug
iOS 13、14版本的部分模拟器存在系统级钥匙串读写缺陷,ADAL写入序列化缓存数据时会触发底层异常。
修复操作:- 优先将模拟器升级到iOS 15及以上稳定版本测试
- 若需兼容旧版模拟器调试,可在iOS平台的ADAL初始化逻辑中,针对Debug下的模拟器环境临时使用内存缓存替代持久化缓存,参考代码:
#if DEBUG && __IOS__ && SIMULATOR // 仅用于模拟器调试,正式发布版本需移除该段逻辑 public static AuthenticationContext AuthContext = new AuthenticationContext(authority, false, new TokenCache()); #else public static AuthenticationContext AuthContext = new AuthenticationContext(authority); #endif
- ADAL包版本适配问题
版本号低于5.2.0的ADAL库未适配Xamarin.iOS对ARM64模拟器的编译要求,TokenCache的二进制序列化逻辑会触发类型加载异常。
修复操作:- 将共享项目、所有平台项目引用的
Microsoft.IdentityModel.Clients.ActiveDirectoryNuGet包统一升级到最新稳定版,确保各项目引用的版本号完全一致 - 清理解决方案,手动删除iOS项目下的bin、obj文件夹后重新生成部署
- 将共享项目、所有平台项目引用的
验证方式
完成上述修改后,打开iOS模拟器的设备菜单,选择「Erase All Content and Settings」重置模拟器环境,重新部署应用触发登录流程即可验证修复结果。
内容的提问来源于stack exchange,提问作者Xamarin
相关产品推荐
相关产品推荐

