WCFサービスのためのシステムがあり、クライアントからいくつかの資格情報を取得しています。次に、これらの資格情報を使用してCRMを使用して認証を試みます。認証が失敗した場合は、web.configに資格情報が格納された事前定義されたサービスアカウントを使用します。CRMコンテキストオブジェクトは新しいインスタンスを作成しても接続を維持します
私が見つけたことは、最初のオブジェクトをどれだけ壊しても、使用されている資格情報の最初のセットがそれ以降の要求に対しても持続することです。私は新しいオブジェクトをインスタンス化し、using
ステートメントなどの文脈で囲みます。
私は単純な「接続、再試行」ブロックにコードを流し込みましたが、これには同じ問題があります。コードは以下の通りである:
try
{
var connection = new CrmConnection();
connection.ServiceUri = new Uri("https://my.crm.dynamics.com/");
connection.ClientCredentials = new ClientCredentials();
connection.ClientCredentials.UserName.UserName = "removed1";
connection.ClientCredentials.UserName.Password = "removed1";
using (var crm = new CrmOrganizationServiceContext(connection))
{
var req = new Microsoft.Crm.Sdk.Messages.WhoAmIRequest();
var resp = (Microsoft.Crm.Sdk.Messages.WhoAmIResponse)crm.Execute(req);
}
}
catch (Exception ex) { }
try
{
var connection = new CrmConnection();
connection.ServiceUri = new Uri("https://my.crm.dynamics.com/");
connection.ClientCredentials = new ClientCredentials();
connection.ClientCredentials.UserName.UserName = "removed2";
connection.ClientCredentials.UserName.Password = "removed2";
using (var crm = new CrmOrganizationServiceContext(connection))
{
var req = new Microsoft.Crm.Sdk.Messages.WhoAmIRequest();
var resp = (Microsoft.Crm.Sdk.Messages.WhoAmIResponse)crm.Execute(req);
}
}
catch (Exception ex) { }
はremoved1
が間違っているとremoved2
が正しいと仮定します。 2回目の呼び出しでは、無効な資格情報であるトークン例外が発生すると即座に失敗します。 removed1
が正しく、removed2
でない場合、最初の認証はWhoAmIRequest
となります。次に、removed2は失敗するはずですが、古い資格情報を使用して接続を保持しているように見えます。無効な資格情報によって、依然としてサービスが要求を行うことができます。良くない!
奇妙なことは、認証コードが別のプロジェクトにあることです。私はこのプロジェクトをシンプルなコンソールアプリケーションに組み込みました。すべてうまく動作します。私はこれがWCFサービスとそれが接続を保持する方法と関係があると仮定することができます。私は手作業での処理、ガベージコレクションの呼び出し、ヌルへの設定などを試みました。名前で呼び出されたWeb設定の接続文字列(2つのハードコードされたコード)を試してみました。 CrmConnection.Parse()
など
私はコンソールアプリケーションに直接使用しているコードを貼り付けてコピーしても問題ありません。これにより、コード自体ではなく、WCFサービスの動作と関係があると私は確信しています。私は
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
しかし、運の振る舞いを持つようにクラスを設定します。何らかの重要性がある場合、このコードはIDispatchMessageInspector
を実装するメッセージインスペクタクラスで実行されています。
新しいセッションを確保するにはどうすればよいですか?ありがとう。
私は新しいCrmConnection()を 'CrmConnection.Parse(connString)'に置き換え、接続文字列は標準の 'Url = A; User = B; Password = C;'に置き換えました。しかし、同じ問題がまだ発生しています。キャッシュは 'CrmConnection.Parse(str)'を使っても発生しますか?実行時までユーザー名とパスワードがわからないので、名前で接続文字列を呼び出すことはできません。ありがとう。 – plusheen
ちょうど確認するために、2つの完全に異なる接続文字列を使用し、新しい 'CrmConnection'のコンストラクタでそれらを呼んだときに私はあなたに言っていました。それでも同じ問題が発生します。 – plusheen