IIS和/或ASP.NET如何知道请求来自哪个IP?

IIS和/或ASP.NET如何知道请求来自哪个IP?,asp.net,iis-7.5,security,Asp.net,Iis 7.5,Security,我使用ASP.NET表单身份验证进行安全性验证,有时会出现配置文件重叠问题。i、 e.当我以一个用户的身份登录时,它完全以另一个用户的身份出现在“随机”时间 表单身份验证是一个简单的标准实现,使用cookie作为后续请求的验证。所以我认为问题不存在 在检查用户的IIS日志时,我发现该请求以某种方式与其他活动用户交换,因为它似乎完全来自具有不同ip和用户代理的不同计算机,但却是同一个经过身份验证的用户 我想知道的是ASP.NET或IIS如何确定请求来自哪个IP 编辑开始: 下面的输出是IIS日志的

我使用ASP.NET表单身份验证进行安全性验证,有时会出现配置文件重叠问题。i、 e.当我以一个用户的身份登录时,它完全以另一个用户的身份出现在“随机”时间

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

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

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

编辑开始:

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

第一个请求来自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;
            }

        }            
    }

编辑结束:

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

您的问题的简短答案是,“OS套接字层告诉IIS。”

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


更新:您正在使用
System.Threading.Thread.CurrentPrincipal
,这看起来很狡猾(是的,我读了您链接到的Scott Hanselman的页面)。我不会这么做,除非你完全清楚地理解为什么你需要这么做,以及这意味着什么。例如,如果第二个请求由与第一个请求相同的线程处理,但第二个请求没有经过相同的身份验证块,该怎么办?当时该线程的当前主体是什么?也许它仍然和上次请求一样。

这是一个非常晚的回复。为了社区的利益,我应该尽早更新它。我现在这样做是遵循迟做总比不做好的原则。根本的问题是由设计引起的,而我之前没有意识到这一点

默认情况下,所有项目都由IIS 7及更高版本中的ASP.NET管道处理,其中包括静态文件,如js和css。在IIS的另一个特性出现之前,一切都很好,对于静态文件,它在非常短的时间内在内部使用了一些智能缓存。但是,在我的例子中,它导致错误的配置文件分配给错误的用户


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

通过请求头。给定用户可能有多个IP地址。人们通常没有静态IP地址,如果涉及代理或VPN,您可以看到一个会话跳过IP。@Greg我更新了问题,将IIS日志和身份验证逻辑包括在内。我知道这是非常不可能的基础设施代码的错误,但我仍然无法解释的行为在所有。这可能与网络级别有关吗?@Greg事实上,黑客代码放在那里是为了检查黑客是否解决了问题,显然没有,所以我可以删除它。
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;
            }

        }            
    }