重签名Swift/iOS应用后MSAL认证失败:错误码-42008
MSAL重签名换Bundle ID后认证失败(错误-42008)的排查项
针对你遇到的重签名为企业证书并更换Bundle ID后,MSAL调用acquireToken报错Failed to serialize SSO request dictionary for interactive token request, MSALInternalErrorCodeKey=-42008的问题,除了你已检查的URL Scheme和门户注册项,还需要排查以下与Bundle ID强关联的配置:
MSAL初始化配置中的Bundle ID一致性
检查tryGetMSALContext()里初始化MSALPublicClientApplication的代码:- 若硬编码了旧Bundle ID(A.A.A.A),替换为新的A.A.A.B,或改为动态获取
Bundle.main.bundleIdentifier - 确认
MSALPublicClientApplicationConfig中的redirectUri是否正确对应新Bundle ID生成的格式(msal<你的ClientID>://auth),避免硬编码旧URI
- 若硬编码了旧Bundle ID(A.A.A.A),替换为新的A.A.A.B,或改为动态获取
钥匙串访问组的匹配
MSAL依赖钥匙串存储SSO状态,重签名后需确保:- 新Bundle ID已在Xcode的
Signing & Capabilities->Keychain Sharing中添加对应访问组,且与MSAL初始化时指定的keychainSharingGroup参数完全一致 - 企业证书的
.mobileprovision授权文件中包含该钥匙串访问组的权限 - 重签名后的ipa包内
Info.plist中,与com.microsoft.adalcache相关的钥匙串配置已更新为新Bundle ID对应的组
- 新Bundle ID已在Xcode的
MSAL配置文件的完整性
如果你使用了msal_config.json这类配置文件:- 确认文件中
clientId对应的应用注册里,已添加新Bundle ID对应的重定向URI - 检查配置文件中是否有硬编码的旧Bundle ID或旧重定向URI,全部替换为新值
- 确认文件中
重签名时Info.plist的完整替换
用fastlane sigh重签名时,需验证Info.plist的所有相关字段:CFBundleIdentifier已正确改为A.A.A.BCFBundleURLTypes中的CFBundleURLSchemes完全匹配新Bundle ID对应的MSAL Scheme(需与Azure门户中应用注册的重定向URI一致)- 排查是否有其他自定义配置字段引用了旧Bundle ID
残留缓存清理
旧Bundle ID的SSO缓存可能导致序列化失败:- 测试时先卸载旧应用,再安装重签名后的包
- 或在MSAL初始化前调用
MSALPublicClientApplication.clearCache(for:)清理旧账号缓存
企业证书授权文件的权限
确认.mobileprovision文件包含MSAL所需权限:- 网络权限(
NSAppTransportSecurity是否允许认证域名) - 钥匙串访问权限
- 系统WebView相关权限(若使用系统WebView进行认证)
- 网络权限(
你的认证代码参考:
func getTokenInteractivly() { guard let webViewParamaters = webViewParamaters else { print("Rootview missing") LogService.shared.log(logString: "Rootview missing in getTokenInteractivly()") return } do { let applicationContext = try tryGetMSALContext() let interactiveParameters = MSALInteractiveTokenParameters(scopes: kScopes, webviewParameters: webViewParamaters) applicationContext.acquireToken(with: interactiveParameters, completionBlock: { (result, error) in guard let authResult = result, error == nil else { LogService.shared.log(logString: "Error while acquireToken: \(String(describing: error))") // This is where it fails <----------- return } LogService.shared.log(logString: "Logged in as \(authResult.account.username ?? "noone")") self.setAccountDetails(authResult.account) }) } catch { LogService.shared.log(logString: "Unexpected error during getTokenInteractivly(): \(error)") } }
内容的提问来源于stack exchange,提问作者esbenr
相关产品推荐
相关产品推荐

