代码之家  ›  专栏  ›  技术社区  ›  Greg Oks

CRM 2011使用C连接到组织.svc#

  •  2
  • Greg Oks  · 技术社区  · 12 年前

    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 回复  |  直到 11 年前
        1
  •  6
  •   James Wood    12 年前

    所以,我自己才刚刚开始使用ADFS,我建议阅读 Active Directory and Claims-Based Authentication 如果你还没有。

    同样,从你的代码来看,我认为你的HomeRealmUri是不正确的。您似乎已将CRM发现服务的地址提供给它。我认为如果你只有一个ADFS在玩,你可以把它留空。如中所述 the MSDN here.

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

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

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

    祝你好运

        2
  •  4
  •   Greg Oks    12 年前

    我终于想通了:)

    我缺少“/组织”,这意味着组织Uri应为:

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