代码之家  ›  专栏  ›  技术社区  ›  Stanza

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

  •  2
  • Stanza  · 技术社区  · 6 年前

    我正在尝试通过服务到服务调用从Dynamics 365插件访问Azure函数: https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-service-to-service

    此功能通过 应用服务验证 .

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

    enter image description here

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

    enter image description here

    显然,根据文章I需要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();
    

    我已经确保我有正确的客户机秘密,并且已经对它进行了编码,因为我在某个地方读到了“+”和“/”是不好的。

    邮递员也犯了同样的错误

    有什么想法吗??

    1 回复  |  直到 6 年前
        1
  •  1
  •   Bruce Chen    6 年前

    reqString+=“&resource=”+uri.escaperuriString(” https://keyvaultaccess.azurewebsites.net “”;

    从你开始 resource 参数 https://keyvaultaccess.azurewebsites.net ,我假设你已经设置了 应用程序ID URI 你的AAD应用(clientID等于 5f315431-xxxxxxx-4e257b1b9295 https://keyvaultaccess.azurewebsites.net网站 . 我假设您可以检索访问_令牌,但是当使用访问_令牌访问您的Azure函数端点时,您得到401状态代码。

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

    Active Directory身份验证配置:

    enter image description here

    测试:

    enter image description here

    docode jwt令牌以检查aud属性:

    enter image description here

    访问我的Azure函数终结点:

    enter image description here

    注: 您需要注意您的功能的授权级别,如下所示:

    enter image description here

    如果您还启用函数级身份验证,则发送到Azure函数的请求需要在querystring中包含相关的代码参数或设置头文件。 x-functions-key 使用功能键的值,或者您可以将授权级别设置为“匿名”。