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

时间:2015-01-28 14:17:16

标签: asp.net-web-api odata asp.net-web-api2

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

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 个答案:

答案 0 :(得分:1)

您有几个选择:

  1. 如果您有一个简单的拓扑结构,只有一台机器处理对相对较少数量的用户的请求,您可以实现用户名和密码的内存缓存,您可以使用它来有效地验证后续调用。您可以使用ConcurrentDictionary之类的东西来实现这一点,它可以锁定用户名并提供密码,尽管这种方法存在安全性考虑(你真的希望密码一直在内存中吗?)。
  2. 在验证用户名/密码对后设置Cookie。 cookie可能包含类似时间戳的内容,在此之后应重新验证用户名/密码,以及通过只有服务器知道的方式生成的某种哈希值(并且它可用于验证它是否设置了时间戳)。
  3. 使用这些方法中的任何一种" CheckPassword"方法会将密码与缓存中的密码进行比较,或者检查cookie,如果结果令人满意,则直接创建新的主体而不调用数据库。