首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缓存来自插件的服务调用的每个用户的主体对象

缓存来自插件的服务调用的每个用户的主体对象
EN

Stack Overflow用户
提问于 2013-01-11 01:44:55
回答 3查看 617关注 0票数 1

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

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-11 05:59:07

插件是定期创建和清理的,你不能在任何时间内存储任何东西(或者至少存储它并依赖于它的存在)。

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

例如,为x事件调用- Plugin

  • Get CallingUser from Plugin
  • Search MyCustomSTS entity for User
  • 查看令牌是否存在和/或已过期
  • 如果您有令牌-万岁

<代码>H19如果没有,请跑开并抓取一个<代码>H210<代码>F211

当然,这可能比每次重新验证花费更长的时间!

票数 2
EN

Stack Overflow用户

发布于 2013-01-11 07:27:14

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

理想情况下,你应该写你的插件是无状态的。

Write a Plug-In

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2013-01-11 17:08:49

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14264050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档