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