7

我有一个 ASP.NET 应用程序,它要求用户使用基本身份验证使用他们的域帐户登录。用户可以做出选择,然后按下按钮。

按下按钮后的某个时间点是以下代码:WindowsIdentity.Impersonate(userIdentity.Token). userIdentityWindowsIdentity类型,之前设置为(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 环境中。所有这些环境都是域成员。

4

1 回答 1

11

基本上,您所看到的并不是安全问题,因为登录会话在 TCP 连接的整个生命周期内被 IIS 缓存,但 HTTP 偶尔会切断需要重新身份验证的 TCP 连接。这将无缝且不可见地发生(由浏览器处理),但它将使令牌无效,因为登录会话将在 TCP 连接结束时被破坏。

即,为了@usr 的利益,它有时只起作用,因为登录会话相同,因此令牌相同,因此存储在会话中的令牌起作用,因为它恰好是与User.Identity 相同的实际令牌。这不是避免安全检查的方法,它是安全检查的实现细节。

您不应该在会话中存储身份 - 这是不必要的,因为它是经过身份验证的连接。

只需(WindowsIdentity)User.Identity每次使用,您的问题就会消失。

于 2012-01-30T23:04:36.137 回答