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

在ColdFusion中通过Graph调用获取Azure的SAMAccountName问题

问题:调用Microsoft Graph获取SAMAccountName字段失败

尝试通过调用Azure Graph获取SAMAccountName字段,已成功获取访问令牌,随后调用https://graph.microsoft.com/v1.0/me接口,但返回结果中始终没有该字段,已尝试多种拼写变体。还解码了访问令牌,其中也没有该字段。

使用的代码如下:

<cfset apiUrl = "https://graph.microsoft.com/v1.0/me">

<cfscript>
    graphqlQuery = '{
        me {
            displayName
            mail
            userPrincipalName
            SAMAccountName
            onpremisessamaccountname
        }
    }';

    requestBody = {
        query = graphqlQuery
    };
</cfscript>

<cfhttp url="#apiUrl#" method="get" result="apiResponse" charset="utf-8" timeout="60">
    <cfhttpparam type="header" name="Authorization" value="Bearer #cookie.at#">
    <cfhttpparam type="header" name="Content-Type" value="application/json">
    <cfhttpparam type="body" value="#serializeJSON(requestBody)#">
</cfhttp>

问题分析与修正方案

1. 混用REST与GraphQL请求方式

https://graph.microsoft.com/v1.0/me是Microsoft Graph的REST端点,不支持GraphQL查询格式。你要么改用REST规范的请求方式,要么切换到GraphQL专用端点https://graph.microsoft.com/v1.0/graphql并使用POST方法。

2. 字段名拼写错误

正确的本地SAM账户名字段是**onPremisesSamAccountName**(严格驼峰命名),你使用的SAMAccountName、onpremisessamaccountname都不符合字段名规范,导致无法匹配到目标字段。

3. GET请求携带请求体不符合HTTP规范

REST接口的GET请求不应携带请求体,多数服务器会忽略这类请求的body内容,你的查询参数根本没有被接口识别。


修正后的REST版本代码

使用REST接口时,通过$select参数指定需要返回的字段:

<cfset apiUrl = "https://graph.microsoft.com/v1.0/me?$select=displayName,mail,userPrincipalName,onPremisesSamAccountName">

<cfhttp url="#apiUrl#" method="get" result="apiResponse" charset="utf-8" timeout="60">
    <cfhttpparam type="header" name="Authorization" value="Bearer #cookie.at#">
</cfhttp>

修正后的GraphQL版本代码

如果坚持使用GraphQL,需切换到专用端点并改用POST方法:

<cfset apiUrl = "https://graph.microsoft.com/v1.0/graphql">

<cfscript>
    graphqlQuery = '{
        me {
            displayName
            mail
            userPrincipalName
            onPremisesSamAccountName
        }
    }';

    requestBody = {
        query = graphqlQuery
    };
</cfscript>

<cfhttp url="#apiUrl#" method="post" result="apiResponse" charset="utf-8" timeout="60">
    <cfhttpparam type="header" name="Authorization" value="Bearer #cookie.at#">
    <cfhttpparam type="header" name="Content-Type" value="application/json">
    <cfhttpparam type="body" value="#serializeJSON(requestBody)#">
</cfhttp>

额外注意事项

  • onPremisesSamAccountName字段仅存在于从本地AD同步到Azure AD的用户,纯云原生用户没有该字段。
  • 确保你的应用已被授予User.Read或更高权限(如User.Read.All),且权限已得到管理员同意。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:23:23