CRM 2011使用C#连接到organization.svc

时间:2012-08-07 15:43:40

标签: service dynamics-crm-2011 credentials discovery

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为null。

2 个答案:

答案 0 :(得分:6)

所以,我刚开始自己​​使用ADFS,如果你已经知道,我建议你阅读Active Directory and Claims-Based Authentication

另外,从查看您的代码我不认为您的HomeRealmUri是正确的。您似乎已经为其提供了CRM发现服务的地址。如果您只有单个ADFS,我认为您可以将其保留为null。如the MSDN here.

中所述

我本以为它看起来更像是这样的:urn:federation:contoso

对于用户名,我认为您需要指定域,您通常必须使用以下格式:domain @ domain

你可能还想看看这个example这是一个与Crm对话的网页上的单一标志,这听起来很像你想要实现的目标。

祝你好运。

答案 1 :(得分:4)

我终于明白了:)

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

 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中包含“/组织”的终结点。