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からのもので、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;
            }

        }            
    }

編集終了:

4

3 に答える 3

2

あなたの質問に対する簡単な答えは、「OS ソケット層が IIS に通知する」です。

より長い答えは、複数のユーザーが同じ IP アドレスを共有している可能性があるため、IP アドレスだけでは個々のユーザーを識別するのに十分ではないということです。Cookie はブラウジング セッションを識別します。ブラウジング セッションが混同されるという問題がある場合、これはIIS や OS ソケット レイヤーの問題ではなく、アプリケーション コードの問題である可能性があります (どちらも現実世界で非常によくテストされています)。

更新:あなたは をハッキングしていますがSystem.Threading.Thread.CurrentPrincipal、これは危険なようです (そうです、あなたがリンクした Scott Hanselman のページを読みました)。なぜそれを行う必要があるのか​​ 、そしてそれが何を意味するのかを完全に明確に理解していない限り、私はそれをしません. たとえば、2 番目の要求が最初の要求と同じスレッドによって処理されるが、2 番目の要求が同じ認証ブロックを通過しない場合はどうなるでしょうか? その時点でそのスレッドに接続されている現在のプリンシパルは何ですか? 前回のリクエストと同じかもしれません。

于 2012-08-27T03:55:46.440 に答える
0

IIS は、OS ネットワーク層から受信したパケットにエンコードされた IP アドレスを取得するだけです。OSI モデルからすべてのネットワーク レイヤー ビジネスを掘り下げることなく、ASP.NET は実際には、基盤となる Web サーバーが HTTP、FTP などのプロトコルでエンコードされて提供する IP 情報にすぎません。

于 2012-08-27T03:55:41.760 に答える