2012-03-28 28 views
0

私は多くのasp.netアプリケーションをホストするWebサイトを持っています。 MVC2で書かれたものと、MVC3で書かれたものと、社内で書かれていないものとバイナリデプロイされたもの(ソースコードがありますが)がASP.Net 2.0 Webフォームに書かれています。これらすべてのサイトには、ログインアプリケーションの1つのログインページが使用されています。我々は、すべてのアプリケーションを共有しているため、これを行うことができます。カスタムFormsAuthenticationTicketの検証

  1. 同じアプリケーションプール
  2. 同じマシンキー
  3. 同じログインCookie名

を私の問題は、彼らはまた、セキュリティ上の問題を共有しています、クッキースプーフィング保護なし。 ログインクッキー(おそらくuseradataフィールド内)にいくつかの追加情報(ipの最初の2バイト、ユーザーエージェント)を追加して、すべてのリクエストでこれを確認してから、クッキーを受け入れる予定です。

私の質問は、フォーム認証チケットをチェックしてユーザーをロードする場所です。ログインを使用する前にいくつかの余分なことを確認するためにこれを上書きすることができます。

このコードをすべてのglobal.csに追加する必要がない場合はプラスになり、設定ファイルのdllを参照してdllを参照できます。

+0

。 – Jeff

+0

Global.asaxでApplication_AuthenticateRequestイベントを使用できますか?関連するコメントはここにあります:http://stackoverflow.com/questions/875472/authenticaterequest-event – SilverlightFox

+1

asp.netがクッキーのIPチェックをしない理由は、それが非常にばかげた考えです。モバイルデバイスを使用している場合(分単位で変更可能)、ユーザーの動的IPが変更された場合、または共有プロキシがプールされている場合など、ユーザーのIPアドレスが変更される条件が多すぎます。さらに、これは、ファイアウォールの背後のあるマシンから同じファイアウォールの背後にある別のマシンにクッキーをコピーすることを防ぐものではありません。ユーザーはサイトを使用する能力を壊すことにより、ありそうもない脆弱性を修正しようとしていますが、それは正しく機能しません。 –

答えて

0

新しいFormsAuthenticationModuleを作成する以外は、認証を無効にすることはできませんが、より簡単な方法があります。 ASP.NETパイプライン処理要求が処理されている間、各ステップでイベントが発生します。ここでASP.NETパイプラインを利用して作業を行います。あなたのケースでは

ASP.NET pipeline Authentication & Authorization steps

、あなたはPostAuthenticateRequestHandlerイベントハンドラで、あなたのクッキーを検証することができます。

HttpCookie authCookie = Context.Request.Cookies["YourFormsCookieName"]; 
if (IsValidAuthCookie(authCookie)) 
{ 
    // do some stuff 
} 
else 
{ 
    // expire cookie using FormsAuthentication.Signout() 
    // do some stuff 
} 

これは便利なリンクです:私は助けるが、唯一の私のセッションIDではない、私のログインCookieを手伝ってくれましたことだろうかどうかを確認するために、カスタムSessionIDManagerを追加したサブノートでForms Authentication