在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
相关产品推荐
相关产品推荐

