7

ユーザーが基本認証を使用してドメインアカウントでサインインする必要があるASP.NETアプリがあります。ユーザーは選択を行い、ボタンを押すことができます。

ボタンを押した後のある時点で、次のコードが表示されますWindowsIdentity.Impersonate(userIdentity.Token)userIdentityのタイプはWindowsIdentityであり、以前は(WindowsIdentity)User.Identityに設定されていました。

userIdentityはセッション変数として保存されます。これは、ボタンが押された後、このコードを含むページがAJAXを介して呼び出されるためだと思います。

このコードをヒットすると、約2/3の確率で機能しますが、1/3の確率で、次の例外が発生します。偽装のトークンが無効です。複製できません。私にとって最大のヘッドスクラッチャーは、なぜそれが時々機能するのに、他の時には機能しないのかということだと思います。一部のセッションでは、失敗する前に数回機能します。他の人では、それはすぐに失敗します。

スタックトレースは次のとおりです。

System.Security.Principal.WindowsIdentity.CreateFromToken(IntPtr userToken)で

System.Security.Principal.WindowsIdentity..ctor(IntPtr userToken、String authType、Int32 isAuthenticated)で

System.Security.Principal.WindowsIdentity.Impersonate(IntPtr userToken)で

C:\ dev \ RoomRes \ Resource Booker \ BLL \ ReservationAgent.cs:line101のResource_Booker.BLL.ReservationAgent.SubmitReservationRequest(予約予約、パトロンパトロン)

C:\ dev \ RoomRes \ Resource Booker \ Reserve.aspx.cs:line 474のResource_Booker.Reserve.reserve_Click(Object sender、EventArgs e)で

System.EventHandler.Invoke(オブジェクト送信者、EventArgs e)で

System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)で

System.Web.UI.Page.ProcessRequestMain(ブール値includeStagesBeforeAsyncPoint、ブール値includeStagesAfterAsyncPoint)で

紛らわしい要因は次のとおりです。ローカルホストを使用しているため、認証はここで暗黙的に渡されますが、ローカルのWindows7x64ワークステーションまたはWindows200332ビットIIS6.0環境ではこの問題を再現できません。これは、かなりバニラなWindows2008R2環境でのみ発生します。これらの環境はすべてドメインメンバーです。

4

1 に答える 1

11

基本的に、ログオンセッションはTCP接続の存続期間中IISによってキャッシュされるため、セキュリティ上の問題は発生しませんが、HTTPによってTCP接続が切断され、再認証が必要になる場合があります。これはシームレスかつ目に見えない形で(ブラウザによって処理されて)発生しますが、TCP接続が終了するとログオンセッションが破棄されるため、トークンが無効になります。

つまり、@ usrの利益のために、ログオンセッションが同じでトークンが同じであるために機能する場合があります。したがって、セッションに格納されているトークンは、実際のトークンがUser.Identityと同じであるため機能します。これは、セキュリティチェックを回避する方法ではなく、セキュリティチェックの実装の詳細です。

IDをセッションに保存しないでください。認証された接続であるため不要です。

(WindowsIdentity)User.Identity毎回使用するだけで、問題は解決するはずです。

于 2012-01-30T23:04:36.137 に答える