1

我有一个 Microsoft Dynamics CRM 实施(2010 年或 2011 年不是 100% 肯定)。这个CRM系统需要从插件调用我们内部的服务框架服务。

为了调用服务框架,我们使用带有登录方法的 API,该方法进入 STS 并获取安全令牌。这是针对每个用户进行身份验证并获取用户声明的。登录调用返回一个 IPrincipal 对象,我们将其放在 Thread.CurrentPrincipal 属性上,从那时起,我们可以使用我们的框架调用服务,并且由于执行线程上的主体,用户在每次调用时都经过身份验证。

在 asp.net 网站中,我们通常将用户登录并立即去 STS 获取令牌,然后在会话中为用户缓存该令牌,因为登录不是我们每次想要调用服务时都想做的事情.

我将如何使用 CRM 插件来做到这一点。我是否有权访问每个用户的会话存储?我注意到 IServiceProvider 是作为参数传入的,我可以将服务添加到此容器并使用某种线程安全字典在服务中解决此问题吗?我对 CRM 开发知之甚少,我什至想知道插件是否是正确的方法?

4

3 回答 3

2

该插件会定期创建和清理,您将无法在任何时间段内存储任何内容(或至少存储它并依赖它在那里)。

您可能会将其存储在自定义实体中,但如果这是可能的?

例如 - 为 x 事件调用插件

  • 从插件获取 CallingUser

  • 为用户搜索 MyCustomSTS 实体

  • 查看令牌是否存在和/或已过期

  • 如果你有令牌 - 万岁

  • 如果没有,跑过去抓一个

当然,这可能比每次重新验证都需要更长的时间!

于 2013-01-10T21:59:07.460 回答
0

您是为个人用户还是为服务帐户获取令牌?

理想情况下,您应该将插件编写为无状态的。

编写插件

为了提高性能,Microsoft Dynamics CRM 缓存插件实例。插件的 Execute 方法应该写成无状态的,因为不是每次调用插件都会调用构造函数。此外,多个系统线程可以同时执行插件。所有每次调用的状态信息都存储在上下文中,因此您不应使用全局变量或尝试将任何数据存储在成员变量中以供下次插件调用期间使用,除非该数据是从提供给构造函数的配置参数中获取的。插件注册的更改将导致插件重新初始化。

如果您要为单个用户获取令牌,则可以将其保存在 CRM 中的某个地方,但正如 glossrob 所建议的那样,这种方法存在许多问题。在这种情况下,最好每次都进行身份验证。

如果它用于服务帐户,您可以违背 Microsoft 的建议并将令牌缓存在内存中。从逻辑上讲,只要您编写代码以对随机丢失并不得不重新获取其令牌感到满意,您就应该没问题。

于 2013-01-10T23:27:13.577 回答
0

我同意那些说每次身份验证都是更好的解决方案的人的观点,但是如果您需要存储令牌,您可以创建自定义 CRM 实体并编写逻辑来处理插件中存储在 CRM 中的令牌。

于 2013-01-11T09:08:48.720 回答