优化基本身份验证:为后续请求保存用户身份验证

Optemizing basic auth: Save user authentification for follow up requests

我正在使用 this 教程通过基本身份验证来保护我的 Web-API 通话。基本上它会检查请求中是否有 auth header,然后针对数据库证明此 header:

public static bool CheckPassword(string user, string password)
{
    //Do a Database checkup
    if(CheckDB(user,password)) { 
        //if true, set the principal
        var identity = new GenericIdentity(user);
        SetPrincipal(new GenericPrincipal(identity,null));
    }
    else {
        //return 401...
    }
}
private static void SetPrincipal(IPrincipal principal)
{
    Thread.CurrentPrincipal = principal;
    if (HttpContext.Current != null)
    {
        HttpContext.Current.User = principal;
    }
}

这工作正常。但是它会为我所做的每个请求查询数据库。即使我只是请求一个 JavaScript 文件。

我想优化这个过程,只在第一个请求时调用 CheckDB()。以下所有请求都不需要另一个数据库请求。有可能救校长吗?我试图检查 Thread.CurrentPrincipal 但它似乎会在每次请求时重新初始化。

您有两个选择:

  1. 如果您有一个简单的拓扑结构,只有一台机器处理相对较少用户的请求,您可以在内存中实现用户名和密码缓存,您可以使用它来有效地验证后续调用。您可以使用诸如 ConcurrentDictionary 之类的东西来实现这一点,它可以关闭用户名并提供密码,尽管这种方法存在安全方面的考虑(您真的希望密码一直保存在内存中吗?)。
  2. 在验证 username/password 对后设置 cookie。 cookie 可以包含类似时间戳的内容,之后 username/password 应该重新生效,以及某种只有服务器知道的方式生成的哈希(并且它可以用来验证它是否设置了时间戳) .

使用这些方法中的任何一种,"CheckPassword" 方法要么将密码与缓存中的密码进行比较,要么检查 cookie,如果结果令人满意,则直接创建一个新主体而不调用数据库。