我有一个Microsoft Dynamics CRM实施(2010年或2011年不是100%肯定)。这个CRM系统需要从插件中调用我们的内部服务框架服务。
为了调用服务框架,我们使用带有登录方法的API,该方法转到STS并获取安全令牌。这是每个用户进行身份验证并获得用户声明。登录调用返回我们放在Thread.CurrentPrincipal属性上的IPrincipal对象,从那时起,我们可以使用我们的框架调用服务,并且由于执行线程上的主体,每次调用都会对用户进行身份验证。
在asp.net网站中,我们通常会将用户登录并立即转到STS获取令牌,然后在会话中为该用户缓存该令牌,因为登录不是我们想要每次执行的操作打电话给服务。
如何使用CRM插件执行此操作。我是否可以访问每个用户的会话存储?我注意到IServiceProvider是作为参数传入的,我可以向这个容器添加服务并在某个服务中使用某种线程安全字典来解决这个问题吗?我对CRM开发知之甚少,我甚至想知道插件是否是正确的方法呢?
答案 0 :(得分:2)
该插件会定期创建和清理,您将无法在任何时间段内存储任何内容(或者至少存储它并依赖它在那里)。
如果可能的话,您可以将其存储在自定义实体中吗?
e.g。 - 为x事件调用插件
从插件中获取CallingUser
为用户搜索MyCustomSTS实体
查看令牌是否存在和/或是否已过期
如果你有令牌 - 万岁
如果没有,请跑掉并抓住一个
当然,这可能比每次重新认证需要更长的时间!
答案 1 :(得分:0)
您要为个人用户或服务帐户提取令牌吗?
理想情况下,您应该将您的插件编写为无状态。
为了提高性能,Microsoft Dynamics CRM会缓存插件实例。应该将插件的Execute方法编写为无状态,因为每次调用插件时都不会调用构造函数。此外,多个系统线程可以同时执行插件。所有每个调用状态信息都存储在上下文中,因此您不应使用全局变量或尝试将任何数据存储在成员变量中,以便在下一个插件调用期间使用,除非该数据是从提供给构造函数的配置参数中获取的。对插件注册的更改将导致插件重新初始化。
如果您为个人用户提取令牌,您可以将其保存在某个地方的CRM中,但该方法存在许多问题,如glosrob建议的那样。在这种情况下,每次最好进行身份验证。
如果是服务帐户,则可能违反Microsoft的建议并将令牌缓存在内存中。从逻辑上讲,只要您编写代码以便随意丢失并且必须重新获取其令牌,您应该没问题。
答案 2 :(得分:0)
我同意那些说每次身份验证都是更好的解决方案的人,但如果您需要存储令牌,您可以创建自定义CRM实体并编写逻辑,这些逻辑将与插件中存储在CRM中的令牌一起使用。