我正在创建一个IIS管理模块,它将处理针对SQL服务器后端数据存储的基本身份验证,而不是windows服务器帐户。我参考了一篇关于如何做到这一点的微软文章,并使用以下事件来连接身份验证请求。
//Subscribe to the authenticate event to perform the authentication.
context.AuthenticateRequest += new EventHandler(this.AuthenticateUser);
在该身份验证代码中,我访问数据库以检查所提供的用户名和密码是否与用户匹配,如果匹配,则设置用户主体。
//Create the user principal and associate it with the request.
context.User = new GenericPrincipal(new GenericIdentity(userName), null);
我的问题是,对于这个点之后的每个请求,是否调用authenticateuser函数并命中数据库?我看到每个请求都传递了基本的身份验证授权头,甚至是jpg等,我想知道IIS是否知道这个用户是经过身份验证的,不调用数据库,或者每个请求都调用身份验证调用,而不是需要请求凭据,浏览器发送它们,所以它仍然对每个请求进行数据库检查?
对于那些想知道的人,我在整个模块事件中放置了一堆数据库日志,以检查事情进行的顺序。原来AuthenticateRequest事件函数被调用的每个请求服务器,包括图像,javascript, css, json文件,html等。
因此,如果我在AuthenticateRequest中做一个数据库检查,那么它将在每个页面视图中命中多次。我实现了一个缓存系统来解决这个问题,所以第一次调用AuthenticateRequest函数时,它将击中数据库,并在需要再次调用数据库之前将该用户缓存一段时间。