具有 windows 身份验证的 CRM DiscoveryServiceProxy
CRM DiscoveryServiceProxy with windows authentication
我们有一个 WCF 服务托管在 IIS 上的场景。认证方式为WINDOWS。
我们正在使用 windows 身份验证从 CRM 插件调用此 WCF 服务。
在获取 CRM 组织实例时,我们没有获取 windows 用户上下文。
private OrganizationDetail DiscoverOrganization(Uri discoveryUri, string organizationName, ClientCredentials lclClientCredentials)
{
DiscoveryServiceProxy serviceProxy;
using (serviceProxy = new DiscoveryServiceProxy(discoveryUri, null, lclClientCredentials, null))
{
IDiscoveryService service = serviceProxy;
var orgsRequest = new RetrieveOrganizationRequest()
{
AccessType = EndpointAccessType.Default,
Release = OrganizationRelease.Current,
UniqueName = organizationName
};
var organizations = (RetrieveOrganizationResponse)service.Execute(orgsRequest);
return organizations.Detail;
}
}
我们尝试如下设置凭据,
lclClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
lclClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
我认为您不能通过这种方式将 Dynamics 客户端用户的 Windows 身份传递给 Web 服务。 Dynamics 插件在三个 Windows 帐户之一下执行:
- 账户 运行 沙箱服务(对于在插件沙箱中注册的同步插件)
- 帐户 运行ning CRM 网络应用程序池(用于在沙箱外注册的同步插件)
- 账户运行宁异步服务(对于异步插件)
最重要的是调用插件的客户端用户的 Dynamics (systemuser
) 身份,而不是 Windows 帐户。沙盒和异步服务 运行 在与 Web 应用程序完全不同的进程中,可能无法知道调用用户的 Windows 身份。
如果 Web 服务需要调用用户的 CRM 身份(以便在 CRM 中充当该用户),您将需要:
- 将客户端
systemuser
的 GUID 从插件传递到 Web 服务。
- 假设部署中使用了多个组织,可能还会通过某种方式从插件向 Web 服务识别 CRM 组织。
- 使用其他机制验证 Web 服务,例如基本身份验证,因此仍然可以确保仅从插件调用该服务。
- 为 Web 服务配置所有相关 CRM 组织的连接详细信息(而不是使用 Discovery 服务),包括它自己在这些组织中的
systemuser
帐户。
- 编辑添加:这可以配置为非交互式用户,以节省许可证。
- 授予 Web 服务的
systemuser
Dynamics 模拟权限,以便它可以充当其他用户。
- 调用网络服务时:
- 从传入组织的配置中检索适当的连接详细信息。
- 明确模拟(使用 Dynamics 模拟)传入的
systemuser
GUID。
我们有一个 WCF 服务托管在 IIS 上的场景。认证方式为WINDOWS。 我们正在使用 windows 身份验证从 CRM 插件调用此 WCF 服务。
在获取 CRM 组织实例时,我们没有获取 windows 用户上下文。
private OrganizationDetail DiscoverOrganization(Uri discoveryUri, string organizationName, ClientCredentials lclClientCredentials)
{
DiscoveryServiceProxy serviceProxy;
using (serviceProxy = new DiscoveryServiceProxy(discoveryUri, null, lclClientCredentials, null))
{
IDiscoveryService service = serviceProxy;
var orgsRequest = new RetrieveOrganizationRequest()
{
AccessType = EndpointAccessType.Default,
Release = OrganizationRelease.Current,
UniqueName = organizationName
};
var organizations = (RetrieveOrganizationResponse)service.Execute(orgsRequest);
return organizations.Detail;
}
}
我们尝试如下设置凭据,
lclClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
lclClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
我认为您不能通过这种方式将 Dynamics 客户端用户的 Windows 身份传递给 Web 服务。 Dynamics 插件在三个 Windows 帐户之一下执行:
- 账户 运行 沙箱服务(对于在插件沙箱中注册的同步插件)
- 帐户 运行ning CRM 网络应用程序池(用于在沙箱外注册的同步插件)
- 账户运行宁异步服务(对于异步插件)
最重要的是调用插件的客户端用户的 Dynamics (systemuser
) 身份,而不是 Windows 帐户。沙盒和异步服务 运行 在与 Web 应用程序完全不同的进程中,可能无法知道调用用户的 Windows 身份。
如果 Web 服务需要调用用户的 CRM 身份(以便在 CRM 中充当该用户),您将需要:
- 将客户端
systemuser
的 GUID 从插件传递到 Web 服务。 - 假设部署中使用了多个组织,可能还会通过某种方式从插件向 Web 服务识别 CRM 组织。
- 使用其他机制验证 Web 服务,例如基本身份验证,因此仍然可以确保仅从插件调用该服务。
- 为 Web 服务配置所有相关 CRM 组织的连接详细信息(而不是使用 Discovery 服务),包括它自己在这些组织中的
systemuser
帐户。- 编辑添加:这可以配置为非交互式用户,以节省许可证。
- 授予 Web 服务的
systemuser
Dynamics 模拟权限,以便它可以充当其他用户。 - 调用网络服务时:
- 从传入组织的配置中检索适当的连接详细信息。
- 明确模拟(使用 Dynamics 模拟)传入的
systemuser
GUID。