1

Microsoft Dynamics CRMを実装しています(2010年または2011年のいずれかが100%確実ではありません)。このCRMシステムは、プラグインから内部サービスフレームワークサービスを呼び出す必要があります。

サービスフレームワークを呼び出すために、STSにアクセスしてセキュリティトークンを取得するログインメソッドを備えたAPIを使用します。これは、ユーザーが主張することを認証して取得するためのユーザーごとです。ログイン呼び出しは、Thread.CurrentPrincipalプロパティに配置したIPrincipalオブジェクトを返します。それ以降、フレームワークを使用してサービスを呼び出すことができ、実行中のスレッドのプリンシパルにより、呼び出しごとにユーザーが認証されます。

asp.net Webサイトでは、通常、ユーザーをログインしてすぐにSTSにアクセスしてトークンを取得し、セッション中のユーザーのためにそのトークンをキャッシュします。これは、サービスを呼び出すたびにログインを実行する必要がないためです。 。

CRMプラグインでこれを行うにはどうすればよいですか。ユーザーごとのセッションストアにアクセスできますか?IServiceProviderがパラメーターとして渡されることに気付きましたが、このコンテナーにサービスを追加して、ある種のスレッドセーフディクショナリを使用するサービスでこの問題を解決できますか?私はCRM開発についてほとんど知りませんが、プラグインがこれを行う正しい方法であるかどうかさえ疑問に思っていますか?

4

3 に答える 3

2

プラグインは定期的に作成およびクリーニングされるため、一定期間何も保存することはできません (または、少なくとも保存してそこにあることに依存します)。

これをカスタム エンティティに格納する可能性はありますが、それが可能な場合はどうでしょうか。

例 - プラグインは x イベントで呼び出されます

  • プラグインから CallingUser を取得

  • ユーザーの MyCustomSTS エンティティを検索します

  • トークンが存在するかどうか、および/または有効期限が切れているかどうかを確認します

  • トークンをお持ちの場合 - 万歳

  • そうでない場合は、逃げて1つをつかみます

もちろん、これは毎回再認証するよりも時間がかかる場合があります!

于 2013-01-10T21:59:07.460 に答える
0

毎回認証がより良い解決策であると言う人々に同意しますが、トークンのストレージが必要な場合は、カスタムCRMエンティティを作成し、プラグインからCRMに保存されたトークンで機能するロジックを作成できます。

于 2013-01-11T09:08:48.720 に答える
0

取得するトークンは、個々のユーザーまたはサービス アカウントのどちらですか?

理想的には、ステートレスになるようにプラグインを作成する必要があります。

プラグインを書く

パフォーマンスを向上させるために、Microsoft Dynamics CRM はプラグイン インスタンスをキャッシュします。コンストラクターはプラグインの呼び出しごとに呼び出されるわけではないため、プラグインの Execute メソッドはステートレスになるように記述する必要があります。また、複数のシステム スレッドが同時にプラグインを実行する可能性があります。呼び出しごとの状態情報はすべてコンテキストに格納されるため、コンストラクターに提供された構成パラメーターからデータが取得されない限り、次のプラグイン呼び出しで使用するためにグローバル変数を使用したり、メンバー変数にデータを格納しようとしたりしないでください。プラグインの登録を変更すると、プラグインが再初期化されます。

個々のユーザーのトークンを取得している場合、それを CRM のどこかに保存できますが、glosrob が示唆するように、そのアプローチには多くの問題があります。この場合、おそらく毎回認証するのが最善です。

サービス アカウントの場合は、Microsoft の推奨事項に反して、トークンをメモリにキャッシュすることができます。論理的には、トークンをランダムに失い、トークンを再取得する必要があることに満足するようにコードを記述している限り、問題はありません。

于 2013-01-10T23:27:13.577 に答える