3

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;
}

ありがとう!

4

2 に答える 2

3

特に明記しない限り (また、OrganizationServiceProxy の作成方法を確認するためのコードがない場合)、オンプレミスの OrganizationServiceProxies は (ユーザー固有のアカウントではなく、サービス アカウントの) 現在の AD アカウントを使用して CRM に接続します。サーバー A で実行しているアプリ プールは CRM ユーザーではなく、サーバー B のアプリ プールは CRM ユーザーだと思います。その場合は、サーバー A のユーザーをサーバー B と同じユーザーに変更するか、サーバー A のユーザーを CRM のユーザーにします。

編集

既定のネットワーク資格情報を使用して CRM に接続しています。これは、どの IIS 認証を使用していても、アプリケーション プール ユーザー アカウントとして CRM に接続することを意味します。これはアプリケーション プールのユーザーが CRM ユーザーである限り機能しますが、おそらくこれは望ましくありません。

次の方法を使用して、ネットワーク資格情報を手動で設定できます。

creds.Windows.ClientCredential = new System.Net.NetworkCredential("UserId", "Password", "DomainName");

次に、ASP.Net ユーザーのドメイン名を取得し、偽装を使用して CRM に接続し、その個人のすべてのセキュリティが正しく適用されるようにします。

于 2013-09-06T19:11:57.847 に答える
0

ばかげたこと - ユーザー名をエスケープしないように注意してください!

creds.Windows.ClientCredential = new NetworkCredential("domain\user", "PASSWORD");

\u はエスケープ シーケンスであることに注意してください。「domain\user」と入力する必要があります。

于 2014-09-11T03:38:29.127 に答える