Dynamics crm 2011 为来自插件的服务调用缓存每用户主体对象

Dynamics crm 2011 为来自插件的服务调用缓存每用户主体对象,dynamics-crm-2011,dynamics-crm,Dynamics Crm 2011,Dynamics Crm,我有一个Microsoft Dynamics CRM实施(不是100%确定的2010年或2011年)。此CRM系统需要从插件调用我们的内部服务框架服务 为了调用服务框架,我们使用了一个API和一个登录方法,该方法将转到STS并获取一个安全令牌。这是每个用户进行身份验证并获取用户声明的信息。登录调用返回一个IPrincipal对象,我们将其放在Thread.CurrentPrincipal属性上,从那时起,我们可以使用框架调用服务,并且由于执行线程上的主体,每个调用都会对用户进行身份验证 在asp

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

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

在asp.net网站中,我们通常会让用户登录并立即转到STS获取令牌,然后在会话中为用户缓存该令牌,因为我们不希望每次调用服务时都进行登录


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

插件是定期创建和清理的,您将无法在任何时间段内存储任何东西(或者至少存储它并依靠它的存在)

您可以潜在地将其存储在自定义实体中,但这是可能的吗

e、 g。 -为x事件调用插件

  • 从插件获取CallingUser

  • 搜索用户的MyCustomSTS实体

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

  • 如果你有代币-万岁

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


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

您获取的令牌是针对个人用户还是针对服务帐户

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

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

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


如果是针对服务帐户的,您可能会违背Microsoft的建议,将令牌缓存在内存中。从逻辑上讲,只要您编写的代码对随机丢失和重新获取其令牌感到满意,您就应该没事。

我同意有人说每次身份验证都是更好的解决方案,但如果您需要存储令牌,您可以创建自定义CRM实体并编写逻辑,该逻辑将使用插件中存储在CRM中的令牌