我有一个 ASP.NET 应用程序,它要求用户使用基本身份验证使用他们的域帐户登录。用户可以做出选择,然后按下按钮。
按下按钮后的某个时间点是以下代码:WindowsIdentity.Impersonate(userIdentity.Token)
. userIdentity是WindowsIdentity类型,之前设置为(WindowsIdentity)User.Identity。
userIdentity存储为会话变量,我认为这是因为在按下按钮后,通过 AJAX 调用包含此代码的页面。
当我点击这段代码时,它在大约 2/3 的时间里工作,但在 1/3 的时间里,我得到了这个异常:Invalid token for impersonation - 它不能被复制。我认为对我来说最大的问题是为什么它有时会起作用,但有时却不起作用?在某些会话中,它会在失败之前工作多次。在其他人身上,它会立即失败。
这是堆栈跟踪:
在 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:line 101 中的 Resource_Booker.BLL.ReservationAgent.SubmitReservationRequest(Reservation reservation, Patron Patron)
在 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(字符串 eventArgument)
在 System.Web.UI.Page.ProcessRequestMain(布尔 includeStagesBeforeAsyncPoint,布尔 includeStagesAfterAsyncPoint)
这是一个令人困惑的因素:我无法在本地 Windows 7 x64 工作站上重现此问题——尽管我的身份验证在此处隐式通过,因为我使用的是 localhost——或在 Windows 2003 32 位 IIS 6.0 环境中。它只发生在非常普通的 Windows 2008 R2 环境中。所有这些环境都是域成员。