优化基本身份验证:为后续请求保存用户身份验证
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
但它似乎会在每次请求时重新初始化。
您有两个选择:
- 如果您有一个简单的拓扑结构,只有一台机器处理相对较少用户的请求,您可以在内存中实现用户名和密码缓存,您可以使用它来有效地验证后续调用。您可以使用诸如 ConcurrentDictionary 之类的东西来实现这一点,它可以关闭用户名并提供密码,尽管这种方法存在安全方面的考虑(您真的希望密码一直保存在内存中吗?)。
- 在验证 username/password 对后设置 cookie。 cookie 可以包含类似时间戳的内容,之后 username/password 应该重新生效,以及某种只有服务器知道的方式生成的哈希(并且它可以用来验证它是否设置了时间戳) .
使用这些方法中的任何一种,"CheckPassword" 方法要么将密码与缓存中的密码进行比较,要么检查 cookie,如果结果令人满意,则直接创建一个新主体而不调用数据库。
我正在使用 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
但它似乎会在每次请求时重新初始化。
您有两个选择:
- 如果您有一个简单的拓扑结构,只有一台机器处理相对较少用户的请求,您可以在内存中实现用户名和密码缓存,您可以使用它来有效地验证后续调用。您可以使用诸如 ConcurrentDictionary 之类的东西来实现这一点,它可以关闭用户名并提供密码,尽管这种方法存在安全方面的考虑(您真的希望密码一直保存在内存中吗?)。
- 在验证 username/password 对后设置 cookie。 cookie 可以包含类似时间戳的内容,之后 username/password 应该重新生效,以及某种只有服务器知道的方式生成的哈希(并且它可以用来验证它是否设置了时间戳) .
使用这些方法中的任何一种,"CheckPassword" 方法要么将密码与缓存中的密码进行比较,要么检查 cookie,如果结果令人满意,则直接创建一个新主体而不调用数据库。