Web サーバー A に MVC4 Web アプリケーションがあり、Web サーバー B にある OrganizationServiceProxy を使用して Dynamics CRM Web サービスを使用しています。MVC4 アプリケーションは、ASP .NET 偽装と Windows 認証を有効にしてセットアップされています。WhoAmI を呼び出すと、次のエラーが表示されます。
「発信者はサービスによって認証されませんでした。」
ここで、MVC4 アプリケーションを Web サーバー A と同じ認証で Web サーバー B (CRM と同じ) に移動すると、例外なく WhoAmI が呼び出されます。
サーバーへの接続に使用されるコードは次のとおりです。
string serviceURL = ConfigurationManager.AppSettings["CRMROOTURL"].ToString() + "XRMServices/2011/Organization.svc";
this.CRMService = GetCRMService(serviceURL);
private OrganizationServiceProxy GetCRMService(string serviceURL)
{
ClientCredentials credentials = new ClientCredentials();
credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
OrganizationServiceProxy client
= new OrganizationServiceProxy(new Uri(serviceURL), null, credentials, null);
return client;
}
IIS Web サイトでの認証のスクリーンショットを次に示します。
正解ごとに、他の人を助けるためにいくつかのスニペットを提供したかっただけです。
string loggedUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
ClientCredentials credentials = new ClientCredentials();
credentials.Windows.ClientCredential = new NetworkCredential(username, password, domain);
OrganizationServiceProxy client
= new OrganizationServiceProxy(new Uri(serviceURL), null, credentials, null);
client.ClientCredentials.Windows.ClientCredential = credentials.Windows.ClientCredential;
// -- Retrieve the user.
QueryExpression expression = new QueryExpression
{
EntityName = "systemuser",
ColumnSet = new ColumnSet("systemuserid")
};
expression.Criteria.AddCondition("domainname", ConditionOperator.Equal, loggedUser);
EntityCollection ec = client.RetrieveMultiple(expression);
if (ec.Entities.Count > 0)
{
// -- Impersonate the logged in user.
client.CallerId = ec.Entities[0].Id;
}
ありがとう!