1

我正在使用 ASP.NET 表单身份验证来确保安全,并且间歇性地遇到配置文件重叠问题。即当我以一个用户身份登录时,它会在非常“随机”的时间完全显示为其他人。

表单身份验证是一个简单的标准实现,使用 cookie 作为后续请求的验证。所以我认为问题不存在。

在检查用户的 IIS 日志时,我发现该请求以某种方式与其他活动用户交换,因为它似乎完全来自具有不同 ip 和用户代理但经过身份验证的用户相同的不同机器。

我想知道的是 ASP.NET 或 IIS 如何确定请求来自哪个 IP?

编辑开始:

下面的输出是 IIS 日志的实际内容(如果站点名称是 TestApp1 则为事件)

date    time    cs-method   cs-uri-stem cs-uri-query    cs-username c-ip    sc-status   time-taken
27/08/12    2:32:32 GET /TestApp1/Actions/ViolationsReferralOther/0     178004  10.1.1.24   200 187
27/08/12    2:33:29 GET /TestApp1/Content/datatables/js/datatables-fnSetFilteringDelay.js       178004  10.1.1.39   304 31

第一个请求来自 IP 地址10.1.1.24,第二个请求来自10.1.1.39,两者都以同一用户身份登录。

验证码

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            if (!authTicket.Expired)
            {
                string[] roles = authTicket.UserData.Split(new Char[] { ',' });

                if (roles == null || roles.Length == 0 || (roles.Length == 1 && roles[0] == ""))
                {
                    FormsAuthentication.SignOut();
                    return;
                }

                GenericPrincipal userPrincipal = new GenericPrincipal(new GenericIdentity(authTicket.Name), roles);
                HttpContext.Current.User = userPrincipal;
                //hack as per http://www.hanselman.com/blog/SystemThreadingThreadCurrentPrincipalVsSystemWebHttpContextCurrentUserOrWhyFormsAuthenticationCanBeSubtle.aspx
                System.Threading.Thread.CurrentPrincipal = HttpContext.Current.User;
            }
            else
            {
                HttpContext.Current.User = null;
            }

        }            
    }

编辑结束:

4

3 回答 3

2

对您的问题的简短回答是“操作系统套接字层告诉 IIS”。

更长的答案是 IP 地址不足以识别单个用户,因为可能有多个用户共享同一个 IP 地址。Cookies 识别浏览会话。如果您遇到浏览会话混淆的问题,这可能是您的应用程序代码中的问题,而不是 IIS 或 OS 套接字层中的问题(这两者在现实世界中都经过了非常好的测试)。

更新:您正在使用System.Threading.Thread.CurrentPrincipal,这似乎很狡猾(是的,我阅读了您链接到的 Scott Hanselman 的页面)。除非您对为什么需要这样做以及其含义有绝对清晰的了解,否则我不会这样做。例如,如果第二个请求由与第一个请求相同的线程处理,但第二个请求没有通过相同的身份验证块怎么办?当时附加到该线程的当前主体是什么?也许它仍然与之前的请求相同。

于 2012-08-27T03:55:46.440 回答
0

IIS 只是获取它从操作系统网络层接收到的数据包中编码的 IP 地址。在不深入研究 OSI 模型中的所有网络层业务的情况下,ASP.NET 实际上只关注底层 Web 服务器提供给它的 IP 信息,这些信息以 HTTP、FTP 等协议进行编码。

于 2012-08-27T03:55:41.760 回答
0

这是一个很晚的答复。为了社区的利益,我应该早点更新它。我现在正在按照迟到总比没有好的原则来做这件事。根本问题是由我之前没有意识到的设计引起的。

默认情况下,所有项目都由 IIS 7 及更高版本中的 ASP.NET 管道处理,其中包括jscss等静态文件。直到 IIS 的另一个功能,对于静态文件,它在极短的时间内在内部使用一些智能缓存之前都很好。但是,就我而言,它导致错误的配置文件分配给了错误的用户。

我从 ASP.NET http 管道中排除了静态文件(通过查看文件 .ext 的天真方式),问题就消失了。

于 2017-07-17T03:18:14.793 回答