セキュリティのために 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からのもので、2 番目の要求は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;
}
}
}
編集終了: