【问题标题】:Consuming Azure hosted WebApi in MS Dynamics CRM Online在 MS Dynamics CRM Online 中使用 Azure 托管的 WebApi
【发布时间】:2016-05-14 01:16:09
【问题描述】:

我们正在使用 MS Dynamics Crm 2016 Online,我们需要从客户端使用 Azure Hosted WebApi。我们正在尝试使用 ajax 调用获取数据。相同的代码在 MS Dynamics Crm 之外适用于我们,但在 Dynamics Crm 中,我们收到拒绝访问错误。我们已经在 webapi 中启用了 CORS,但我们仍然遇到这个问题。看起来它与 Dynamics CRM 相关,但我们无法找到原因和解决方案。

以下是在 MS Dynamics CRM 之外工作的示例代码

        $.ajax({
            url: 'http://myaccountapi.azurewebsites.net/api/Account',
            type: 'POST',
            data: 'testaccount',
            contentType: "application/json",
            success: function(data) {
                processData(data);

            },
            error: function (error) {
                alert(error.statusText);
            }
        });

但是同样的代码在in CRM 中抛出错误:Access denied

【问题讨论】:

  • 您是否在 API 中添加了任何防御层或身份验证层?
  • 从您发布的代码中很难找到原因
  • API 目前已打开...无需身份验证。

标签: azure asp.net-web-api dynamics-crm


【解决方案1】:

由于通过加密连接访问 CRM Online,您还需要使用 SSL 访问外部资源。只需将您的 url 更改为使用 https 就可以了:

        $.ajax({
        url: 'https://myaccountapi.azurewebsites.net/api/Account',
        type: 'POST',
        data: 'testaccount',
        contentType: "application/json",
        success: function(data) {
            processData(data);

        },
        error: function (error) {
            alert(error.statusText);
        }
    });

【讨论】:

    【解决方案2】:

    所以你有一个来自orgName.crmX.dynamics.com 的页面试图调用myaccountapi.azurewebsites.net。这不是 CRM 问题。

    您正在发出可能导致访问被拒绝消息的跨站点请求 - 因为,我猜,您尚未在 WebApi 应用程序中启用 CORS。

    您可以查看完整示例:http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

    启用 CORS

    现在让我们在 WebService 应用中启用 CORS。首先,添加 CORS NuGet 包裹。在 Visual Studio 中,从“工具”菜单中,选择“库包” 管理器,然后选择包管理器控制台。在包管理器中 控制台窗口,输入以下命令:

    Install-Package Microsoft.AspNet.WebApi.Cors

    此命令安装最新的包并更新所有依赖项, 包括核心 Web API 库。使用 -Version 标志来定位 一个特定的版本。 CORS 包需要 Web API 2.0 或更高版本。

    打开文件 App_Start/WebApiConfig.cs。将以下代码添加到 WebApiConfig.Register 方法。

    using System.Web.Http;
    namespace WebService
    {
        public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                // New code
                config.EnableCors();
    
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
            }
        }
    }
    

    接下来,将 [EnableCors] 属性添加到 TestController 类:

    using System.Net.Http;
    using System.Web.Http;
    using System.Web.Http.Cors;
    
    namespace WebService.Controllers
    {
        [EnableCors(origins: "http://mywebclient.azurewebsites.net", headers: "*", methods: "*")]
        public class TestController : ApiController
        {
            // Controller methods not shown...
        }
    }
    

    【讨论】:

    • CORS 已启用,但我们仍然遇到此问题。我在 Internet 上的某个地方发现我们需要使用 Azure 服务总线从 Azure 托管 API 获取数据,它可以工作。
    猜你喜欢
    • 2015-06-05
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多