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

通过Excel VBA调用桌面/MS Office SSO登录Fusion SaaS问题咨询

问题根因

你当前使用的WinHttp.WinHttpRequest.5.1是独立的Windows网络组件,不会复用Office客户端已经完成的SSO认证会话;同时你直接POST IDCS登录端点的逻辑不符合SAML/OAuth2 SSO的跳转流程,且默认的自动登录策略仅对本地Intranet站点生效,公网域名的IDCS不会自动传递Windows凭据,因此返回401错误。

可行方案

方案1:直接调用Excel内置SSO令牌(推荐,适配Office 365/2021及以上版本)

该方案无需额外处理认证逻辑,直接复用Excel已有的登录状态,适配绝大多数Azure AD联合IDCS的SSO场景
Excel已完成账号登录的场景下,可直接通过VBA内置属性获取当前账号的OAuth2访问令牌,无需再走完整的认证流程,直接将令牌带入请求头即可访问IDCS保护的Fusion SaaS资源:

Sub SSOFusionLogin()
    Dim req As Object
    Dim accessToken As String
    ' 获取Excel当前登录账号的SSO访问令牌
    accessToken = Application.AccessToken
    Set req = CreateObject("WinHttp.WinHttpRequest.5.1")
    ' 替换为你要访问的Fusion SaaS受保护接口地址
    sURL = "https://login-XXXX.oraclecloud.com/your-protected-resource"
    req.Open "GET", sURL
    ' 带入SSO令牌
    req.setRequestHeader "Authorization", "Bearer " & accessToken
    req.setRequestHeader "Connection", "keep-alive"
    req.Send
    
    Debug.Print "Status: " & req.Status
    Debug.Print "Response: " & req.responseText
End Sub

方案2:修改WinHttp配置适配SSO流程

如果使用的是旧版Office不支持Application.AccessToken,调整现有WinHttp的配置适配SSO跳转规则:

  1. 开启重定向跟随,适配IDCS的302认证跳转逻辑
  2. 将自动登录策略调整为始终发送凭据
  3. 先GET资源端点而非直接POST登录地址
Sub AutoLoginFixed()
    Dim winHttp As Object
    Set winHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
    ' 替换为实际要访问的Fusion资源地址,不要直接POST登录端点
    sURL = "https://login-XXXX.oraclecloud.com/your-target-page"
    
    winHttp.SetAutoLogonPolicy 1 ' 1=始终自动发送凭据,不限制Intranet域
    winHttp.Option(6) = True ' 开启自动跟随所有重定向
    winHttp.Open "GET", sURL
    winHttp.setRequestHeader "Connection", "keep-alive"
    winHttp.Send
    
    Debug.Print "Status: " & winHttp.Status
    Debug.Print "Status Text: " & winHttp.statusText
    Debug.Print "Response: " & winHttp.responseText
End Sub

如果还是返回401,可手动将*.oraclecloud.com域名添加到Windows Internet选项的「本地Intranet」站点列表,再运行代码即可。

方案3:改用MSXML2.XMLHTTP复用系统会话

MSXML2.XMLHTTP基于WinINet栈实现,会复用系统/浏览器/Office的已认证Cookie和会话,无需额外配置自动登录策略:

Sub WinINetLogin()
    Dim req As Object
    Set req = CreateObject("MSXML2.XMLHTTP.6.0")
    sURL = "https://login-XXXX.oraclecloud.com/your-target-page"
    req.Open "GET", sURL, False
    req.setRequestHeader "Connection", "keep-alive"
    req.Send
    
    Debug.Print "Status: " & req.Status
    Debug.Print "Response: " & req.responseText
End Sub

内容的提问来源于stack exchange,提问作者Vinay G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:45:08