如何在服务器上保存用户凭据以在后台运行查询

时间:2011-04-01 10:12:35

标签: asp.net security architecture credentials

背景

我们有一个ASP.NET / Silveright Web应用程序。 silverlight客户端显示用户 图形形式的特定数据 - 它从服务器请求数据:

enter image description here

问题: 由于服务器必须执行的基础数据库查询,获取此数据的成本很高 - 因此客户端必须等待...

优化理念: 我们在服务器上定期运行数据库查询,将结果写入 'userdata'表在数据库'close'中运行ASP.NET服务器。

运行查询并将数据写入表的过程是 由“数据收集”服务执行,该服务与ASP.NET服务器分开。

enter image description here

当客户端请求数据时,服务器从“userdata”表中检索数据。 这应该是好的和快速的 - 我们可能在与ASP.NET服务器相同的机器上有'userdata'表。即使底层数据库处于脱机状态,我们还可以获得客户端看到数据的额外好处。

当然数据不是实时的 - 但是一旦到达客户端,所有数据都可能会老化。

所以现在我的问题: “数据收集”服务需要用户凭据才能执行这些数据库 查询(因为每个用户对同一查询获得不同的结果)。

问题:

如何以可接受的“安全”方式将用户凭据存储在数据库中? 这样“数据收集”可以冒充用户执行数据库查询。 我们的初始场景基于使用Windows集成登录数据库。

1 个答案:

答案 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实际上会有效。

无论如何,我没有看到持久凭证的好处。只需在新线程的范围内或在消息消息的上下文中使用它们。