Azure 从Dynamics 365插件通过应用程序服务身份验证访问功能应用程序

Azure 从Dynamics 365插件通过应用程序服务身份验证访问功能应用程序,azure,oauth,oauth-2.0,azure-functions,dynamics-365,Azure,Oauth,Oauth 2.0,Azure Functions,Dynamics 365,我正在尝试通过服务对服务调用从Dynamics 365插件访问Azure功能: 此功能通过应用程序服务认证进行保护 我创建了一个功能应用程序并启用了应用程序服务身份验证 在平台功能->身份验证/授权下。 我启用了Azure Active Directory作为身份验证提供程序,并将管理模式设置为Express 然后,我从高级模式获得了生成的客户端ID和客户端密码: 显然,根据文章“我需要4个必需参数”,这就是为基于Azure的函数发出令牌请求所需的全部内容: 客户端ID 客户机密 赠款类型

我正在尝试通过服务对服务调用从Dynamics 365插件访问Azure功能:

此功能通过应用程序服务认证进行保护

我创建了一个功能应用程序并启用了应用程序服务身份验证 在平台功能->身份验证/授权下。 我启用了Azure Active Directory作为身份验证提供程序,并将管理模式设置为Express

然后,我从高级模式获得了生成的客户端ID和客户端密码:

显然,根据文章“我需要4个必需参数”,这就是为基于Azure的函数发出令牌请求所需的全部内容:

客户端ID

客户机密

赠款类型

资源

我请求从Dynamics 365插件生成令牌,但出现以下错误:

Invalid Plugin Execution Exception: Microsoft.Xrm.Sdk.InvalidPluginExecutionException: {"error":"invalid_client","error_description":"AADSTS70002: Error validating credentials. AADSTS50012: Invalid client secret is provided.\r\nTrace ID: 06ddda7f-2996-4c9b-ab7e-b685ee933700\r\nCorrelation ID: d582e2f2-91eb-4595-b44b-e95f42f2f071\r\nTimestamp: 2018-05-23 06:30:58Z","error_codes":[70002,50012],"timestamp":"2018-05-23 06:30:58Z","trace_id":"06ddda7f-2996-4c9b-ab7e-b685ee933700","correlation_id":"d582e2f2-91eb-4595-b44b-e95f42f2f071"}-The remote server returned an error: (401) Unauthorized.
我的代码是:

         var tokenendpoint = "https://login.microsoftonline.com/de194c13-5ff7-4085-91c3-ac06fb869f28/oauth2/token";
         var reqstring = "client_id=" + Uri.EscapeDataString("5f315431-e4da-4f68-be77-4e257b1b9295");
         reqstring += "&client_secret=" + Uri.EscapeDataString("/oK7nh8pl+LImBxjm+L7WsQdyILErysOdjpzvA9g9JA=");
         reqstring += "&resource=" + Uri.EscapeUriString("https://keyvaultaccess.azurewebsites.net");
         reqstring += "&grant_type=client_credentials";

         //Token request
         WebRequest req = WebRequest.Create(tokenendpoint);
         req.ContentType = "application/x-www-form-urlencoded";
         req.Method = "POST";
         byte[] bytes = System.Text.Encoding.ASCII.GetBytes(reqstring);
         req.ContentLength = bytes.Length;
         System.IO.Stream os = req.GetRequestStream();
         os.Write(bytes, 0, bytes.Length);
         os.Close();

         //Token response
         HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
         StreamReader tokenreader = new StreamReader(resp.GetResponseStream());
         string responseBody = tokenreader.ReadToEnd();
我已经确定我拥有正确的客户机密码,并且已经对其进行了编码,因为我在某个地方读到“+”和“/”都不好

我在《邮递员》中也犯了同样的错误

有什么想法吗

reqstring+=“&resource=“+Uri.EscapeUriString(”)

由于您将
资源
参数设置为
https://keyvaultaccess.azurewebsites.net
,我假设您已将AAD应用程序的应用程序ID URI设置为
https://keyvaultaccess.azurewebsites.net
。我假设您可以检索access_令牌,但是当使用access_令牌访问azure函数端点时,您得到了401状态代码

您需要修改Active Directory身份验证的高级管理模式,添加
https://keyvaultaccess.azurewebsites.net
允许的令牌访问群体或在发送获取访问令牌的令牌请求时,将
资源
参数更改为您的AAD客户端ID

Active Directory身份验证配置:

测试:

对JWT令牌进行Docode以检查aud属性:

访问my Azure功能端点:

注意:您需要注意以下功能的授权级别:


如果您还启用功能级身份验证,则发送到azure功能的请求需要在查询字符串中包含相关的代码参数,或者使用功能密钥的值设置标题
x-functions-key
,或者您可以将授权级别设置为匿名。

我已将我的机密更改为“Hello”还是没有joyHi Bruce,很抱歉,我刚刚注意到了你的回复,最后我把我的资源改成了我的客户ID,一切正常。