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

iOS平台MSAL/ADAL库配置问题及AADSTS90130错误排查

Azure AD集成问题解决方案

嘿,我来帮你搞定这两个实际开发中常见的Azure AD集成问题,咱们一步步拆解:

一、配置MSAL Objective-C iOS示例项目

要跑通官方的MSAL Objective-C示例,关键是把Azure AD应用的信息正确填到项目里,步骤如下:

  • 拿到官方示例项目后,打开项目找到配置入口:一般是在SampleMSAL.xcconfig文件,或者直接在代码里找MSALPublicClientApplication的初始化代码
  • 配置核心参数:
    • clientId:替换成你在Azure AD里注册的应用客户端ID(就是那串字母数字组成的ID)
    • tenantId:如果是客户的单租户应用,填客户的租户ID;如果是多租户应用,填common即可
    • redirectUri:必须和Azure AD应用注册里配置的重定向URI完全一致,iOS端格式一般是msauth.<你的BundleID>://auth
  • 配置Info.plist:
    • 添加URL类型:URL Schemes填msauth.$(PRODUCT_BUNDLE_IDENTIFIER),保证Azure登录后能跳回你的App
    • 添加LSApplicationQueriesSchemes数组,里面加上msauthv2,确保App能唤起Azure的登录页面
  • 最后运行项目,点击登录按钮,就能正常进入Azure AD的登录流程了

二、Swift 3.0项目集成ADAL后报错AADSTS90130

这个错误AADSTS90130本质是重定向URI不匹配,或是应用配置存在问题,咱们逐个排查:

错误说明:AADSTS90130是Azure AD返回的提示,意思是你请求里带的重定向URI,和Azure门户里应用注册的URI完全对不上,导致Azure不知道该把登录结果发回哪里

解决步骤:

  • 先核对重定向URI:
    打开Azure门户里客户的应用注册页面,找到“重定向URI”配置,确保你Swift代码里设置的redirectUri和这里的内容完全一致(大小写、符号、BundleID都不能错)。iOS端ADAL的重定向URI格式必须是msauth.<你的BundleID>://auth,而且要选“移动和桌面应用”类型
  • 检查租户配置:
    如果客户的应用是单租户,那初始化ADAL的时候必须指定客户的租户ID,不能用common。比如代码里要这么写:
    let authority = "https://login.microsoftonline.com/<客户的租户ID>"
    let context = ADAuthenticationContext(authority: authority, error: nil)
    
  • 核对Bundle ID:
    确保Xcode项目里的Bundle ID,和Azure AD应用注册里关联的Bundle ID一致(有些场景需要在Azure里明确配置App的Bundle ID)
  • 配置Info.plist:
    添加URL Scheme为msauth.<你的BundleID>,同时在LSApplicationQueriesSchemes数组里加入msauth,保证ADAL能正常唤起登录页面
  • 代码示例参考:
    let clientId = "<客户的应用客户端ID>"
    let redirectUri = URL(string: "msauth.com.yourcompany.customerapp://auth")!
    let resourceUri = "<你要访问的API资源URI>" // 比如客户的企业API地址
    let authority = "https://login.microsoftonline.com/<客户租户ID>"
    
    let context = ADAuthenticationContext(authority: authority, error: nil)
    context.acquireToken(withResource: resourceUri, 
                         clientId: clientId, 
                         redirectUri: redirectUri, 
                         completionBlock: { (result, error) in
        if let error = error {
            print("登录错误:\(error.localizedDescription)")
            return
        }
        // 拿到令牌后处理业务逻辑
        guard let accessToken = result?.accessToken else { return }
        print("获取到令牌:\(accessToken)")
    })
    

内容的提问来源于stack exchange,提问作者Sergio Armisén

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:40:58