使用Azure AD Credientials连接CRM Webservices

时间:2016-05-26 14:31:24

标签: .net asp.net-mvc azure dynamics-crm

我有一个.NET MVC应用程序,它将与CRM 2016 Online一起使用。我将Azure AD身份验证添加到项目中,并且工作正常,以便用户可以使用他们用于CRM的相同帐户登录。如果已经记录,则没有登录屏幕。

问题是我想使用这些凭据通过组织服务或Web Api从CRM获取数据。

如何使用我已有的登录信息并将其传递给服务?这个地方有代码样本吗?

似乎ADAL将是最佳选择。我在这里试过这段代码 https://msdn.microsoft.com/en-us/library/gg327838.aspx

// Authenticate the registered application with Azure Active Directory.
AuthenticationContext authContext = 
new AuthenticationContext("https://login.windows.net/common", false);
AuthenticationResult result = authContext.AcquireToken(resource, clientId, new
                                                   Uri(redirectUrl));

没有AuthenticationContext。我添加了ADAL NuGet包以获得此功能。但是失败了! AuthenticationContext中没有AcquireToken方法。有一个叫做AcquireTokenASync,它有完全不同的参数。所以我也被困在这里了!

如果这样可行,是否可以使用我已经完成的Azure AD登录,还是会弹出新的登录屏幕?

1 个答案:

答案 0 :(得分:0)

这可能不适合你的情况,但你可以。

  1. 在服务帐户下运行您的MVC应用程序。
  2. 使用服务帐户凭据访问CRM。
  3. 当有人登录您的MVC应用程序时,我认为您将拥有类似他们的电子邮件地址或域名的内容。
  4. 作为服务帐户搜索与systemuser匹配的电子邮件地址或域名的CRM。您需要找到系统用户记录Id。
  5. 创建另一个IOrganizationService,但传递您在CRM中找到的用户记录ID。
  6. 实际上,您的服务帐户正在冒充登录MVC应用的用户。您所做的任何事情都将作为模仿用户完成。
  7. Impersonate another user

    // Retrieve the system user ID of the user to impersonate.
    OrganizationServiceContext orgContext = new OrganizationServiceContext(_serviceProxy);
    _userId = (from user in orgContext.CreateQuery<SystemUser>()
              where user.FullName == "Kevin Cook"
              select user.SystemUserId.Value).FirstOrDefault();
    
    // To impersonate another user, set the OrganizationServiceProxy.CallerId
    // property to the ID of the other user.
    _serviceProxy.CallerId = _userId;
    

    Impersonate another user using the Web API

    POST [Organization URI]/api/data/v8.1/accounts HTTP/1.1
    MSCRMCallerID: 00000000-0000-0000-000000000002
    Accept: application/json
    Content-Type: application/json; charset=utf-8
    OData-MaxVersion: 4.0
    OData-Version: 4.0
    
    {"name":"Sample Account created using impersonation"}