我正在使用 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;
}
}
}
编辑结束: