2

CRM 2011 使用 ADFS 和 HTTPS 进行设置。我正在尝试从自定义网页连接到 organization.svc,该网页与 CRM 2011 位于同一 IIS 上,但使用以下代码作为不同的网站:

OrganizationServiceProxy serviceProxy;
ClientCredentials clientCredentials = new ClientCredentials();
clientCredentials.UserName.UserName = "admin";
clientCredentials.UserName.Password = "pass";

Guid contactId = Guid.Empty;

Uri OrganizationUri = new Uri(String.Format("https://organization.crmdev.com:port/XRMServices/2011/Organization.svc"));

Uri HomeRealmUri = new Uri(String.Format("https://organization.crmdev.com:port/XRMServices/2011/Discovery.svc"));

using (serviceProxy = new OrganizationServiceProxy(OrganizationUri, null, clientCredentials, null))
{
    serviceProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
    IOrganizationService service = (IOrganizationService)serviceProxy; 
    Entity contact = new Entity("contact");
    contact.Attributes["lastname"] = "oi oi";
    contactId = service.Create(contact);
}

它返回错误消息:

从另一方收到不安全或不正确安全的故障。有关故障代码和详细信息,请参见内部 FaultException。ID3242:无法对安全令牌进行身份验证或授权。

在事件查看器中我看到错误:

Account For Which Logon Failed:
    Security ID:        NULL SID
    Account Name:       admin
    Account Domain: 
Failure Reason:     Unknown user name or bad password.

虽然我给出了正确的用户名和密码..

如果我尝试替换:

using (serviceProxy = new OrganizationServiceProxy(OrganizationUri, null, clientCredentials, null))

和:

using (serviceProxy = new OrganizationServiceProxy(OrganizationUri, HomeRealUri, clientCredentials, null))

它返回:

你调用的对象是空的。

因为 serviceProxy 为空。

4

2 回答 2

6

所以,我自己刚刚开始使用 ADFS,如果您还没有的话,我建议您阅读Active Directory 和基于声明的身份验证

另外,通过查看您的代码,我认为您的 HomeRealmUri 不正确。您似乎已经给它提供了 CRM 发现服务的地址。如果您只有一个 ADFS 在玩,我认为您可以将其保留为空。如MSDN 中所述。

我本来希望它看起来更像这样:urn:federation:contoso

对于用户名,我相信您需要指定域,通常您必须以这种格式执行:username@domain

您可能还想查看此示例,它是与 Crm 对话的网页上的单一登录,这听起来很像您想要实现的目标。

祝你好运。

于 2012-08-07T20:19:56.760 回答
4

我终于想通了:)

我错过了“/organization”,这意味着 organizationUri 应该是:

 Uri OrganizationUri = new Uri(String.Format("https://organization.crmdev.com:port/organization/XRMServices/2011/Organization.svc"));

当我使用这段代码时,我已经弄清楚了:

IDiscoveryService discoveryService = new DiscoveryServiceProxy(discoveryUri, null, userCredentials, null);

            RetrieveOrganizationRequest orgRequest =
                                        new RetrieveOrganizationRequest()
                                        {
                                            UniqueName = "organization name",
                                            AccessType = EndpointAccessType.Default,
                                            Release = OrganizationRelease.Current
                                        };
            RetrieveOrganizationResponse org =
                    (RetrieveOrganizationResponse)discoveryService.Execute(orgRequest);

并看到该组织的端点包括 Uri 中的“/组织”。

于 2012-08-08T14:06:10.367 回答