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