Hololens(1/2代)Unity对接Azure AD AcquireTokenAsync反序列化异常咨询
异常根因说明
这个报错和你的Azure AD认证业务逻辑本身无关,本质是MSAL(Microsoft Identity.Client)运行在Unity IL2CPP后端下的兼容性问题:Unity在反序列化MSAL内部的OAuth2响应对象时,碰到OAuth2ResponseBase类下仅实现get访问器的只读Claims属性,触发了严格的只读成员序列化校验,直接抛出异常。
常见触发场景
- 参照的旧教程对应的MSAL包版本过旧(3.x及更早分支),该版本的内部OAuth2响应类未给
Claims属性补充set访问器,在桌面.NET环境下可正常运行,但在Hololens对应的IL2CPP构建环境中序列化校验逻辑更严格,会直接抛出异常 - 项目存在多版本MSAL依赖冲突,不同版本的内部OAuth2类定义错配,反序列化时匹配到了无set访问器的旧类定义
- Unity的IL2CPP代码裁剪规则配置过严,误将MSAL内部类的set访问器成员裁剪删除
问题定位步骤
- 检查项目NuGet引用列表,确认当前引用的
Microsoft.Identity.Client版本,排查是否存在版本错配、多版本并存的问题 - 打开Unity Player Settings,检查IL2CPP裁剪配置,确认
Microsoft.Identity.Client相关程序集是否被纳入裁剪排除白名单 - 输出完整异常堆栈,确认报错触发位置是否集中在MSAL缓存读取、OAuth2响应反序列化环节,排除业务自定义序列化器误触发的可能
可落地解决方案
- 优先将MSAL包升级到适配Unity IL2CPP的5.x LTS稳定版本,该版本已经为所有内部OAuth2响应类的属性补充了公开set访问器,可直接消除当前序列化报错
- 若因兼容性限制无法升级MSAL版本,可在项目的
link.xml裁剪规则文件中补充对应保护配置,避免IL2CPP裁剪掉MSAL内部类的成员:<linker> <assembly fullname="Microsoft.Identity.Client"> <type fullname="Microsoft.Identity.Client.Internal.OAuth2.OAuth2ResponseBase" preserve="all" /> </assembly> </linker> - 针对Hololens/UWP场景调整
AcquireTokenAsync的交互参数,补充父窗口关联配置,避免走无窗口的隐式交互分支触发的内部序列化异常 - 临时排查阶段可先禁用MSAL本地token缓存,清除设备上残留的旧版本MSAL写入的本地缓存文件,排除旧格式缓存数据触发的反序列化不兼容问题
内容的提问来源于stack exchange,提问作者JRodrigues
相关产品推荐
相关产品推荐

