背景
我们有一个ASP.NET / Silveright Web应用程序。 silverlight客户端显示用户 图形形式的特定数据 - 它从服务器请求数据:
问题: 由于服务器必须执行的基础数据库查询,获取此数据的成本很高 - 因此客户端必须等待...
优化理念: 我们在服务器上定期运行数据库查询,将结果写入 'userdata'表在数据库'close'中运行ASP.NET服务器。
运行查询并将数据写入表的过程是 由“数据收集”服务执行,该服务与ASP.NET服务器分开。
当客户端请求数据时,服务器从“userdata”表中检索数据。 这应该是好的和快速的 - 我们可能在与ASP.NET服务器相同的机器上有'userdata'表。即使底层数据库处于脱机状态,我们还可以获得客户端看到数据的额外好处。
当然数据不是实时的 - 但是一旦到达客户端,所有数据都可能会老化。
所以现在我的问题: “数据收集”服务需要用户凭据才能执行这些数据库 查询(因为每个用户对同一查询获得不同的结果)。
问题:
如何以可接受的“安全”方式将用户凭据存储在数据库中? 这样“数据收集”可以冒充用户执行数据库查询。 我们的初始场景基于使用Windows集成登录数据库。
答案 0 :(得分:1)
据我了解,您需要为每个用户运行一个查询,但您不希望将其设置为阻止调用。您需要非规范化读取模型UserData的响应能力。
我知道你不是在某处存储凭据,而只是启动一个线程并为该线程提供从请求中获取的当前凭据。
class MyClass
{
public static void DoSomething(object principal)
{
if (principal == null || !(principal is IPrincipal))
throw new ArgumentException();
Thread.CurrentPrincipal = (IPrincipal) principal;
// Do heavy querying and update UserData
}
}
我从这样的ASP.NET MVC控制器中调用它:
public ActionResult Index()
{
var t = new Thread(MyClass.DoSomething);
t.Start(User);
return View();
}
这会更新每个请求的UserData。如果需要,您可以为更新频率引入一些逻辑,并仅在某些条件下进行调用。
我正在考虑的另一种方法是迈向CQRS思维模式的一步,在这种情况下我将发布包含序列化IPrincipal
的消息,并且该消息将由另一个将更新读取的实例/服务器使用模型作为一个单独的过程。但我不确定如果在另一台服务器上进行反序列化,IPrincipal
实际上会有效。
无论如何,我没有看到持久凭证的好处。只需在新线程的范围内或在消息消息的上下文中使用它们。