WindowsIdentity.在ASP.NET中随机模拟”;用于模拟的令牌无效-它不能重复;

本文关键字:模拟 无效 令牌 不能 用于 NET 随机 WindowsIdentity ASP | 更新日期: 2023-09-27 18:21:14

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

在按下按钮后的某个时刻,会出现以下代码:WindowsIdentity.Impersonate(userIdentity.Token)userIdentity是WindowsIdentity的类型,以前设置为(WindowsIdentity)User.Identity

userIdentity存储为会话变量,我认为这是因为在按下按钮后,包含此代码的页面将通过AJAX调用。

当我点击此代码时,它大约有2/3的时间有效,但有1/3的时间,我会得到以下异常:用于模拟的无效令牌-它不能重复我想最让我头疼的是,为什么它有时有效,但其他时候无效?在某些会话中,它工作了好几次才失败。在其他方面,它会立即失败。

这是堆栈跟踪:

在System.Security.Printer.WindowsIdentity.CreateFromToken(IntPtr userToken)

在System.Security.Printer.WindowsIdentity.ctor(IntPtr userToken,String authType,Int32 isAuthenticated)

在System.Security.PPrincipal.WindowsIdentity。Impersonate(IntPtr userToken)

位于C:''dev''RoomRes''Resource Booker''BLL''ReserveAgent.cs:line 101 中的Resource_Booker.BLL.ReserveAgent.SubmitReservationRequest(预订,赞助人)

位于C:''dev''RoomRes''Resource Booker''Reserve.aspx中的Resource_Booker.Reserve.Reserve_Click(Object sender,EventArgs e)。cs:line 474

在System.EventHandler.Invoke(Object sender,EventArgs e)

在System.Web.UI.WebControls.Button.RisePostBackEvent(字符串事件参数)

在System.Web.UI.Page.ProcessRequestMain上(布尔值包括同步点之前的阶段,布尔值包含同步点之后的阶段)

这里有一个令人困惑的因素:我无法在我的本地Windows 7 x64工作站上或在Windows 2003 32位IIS 6.0环境中重现这个问题——尽管我的身份验证是在这里隐式传递的,因为我使用的是localhost。它只发生在一个非常普通的Windows2008R2环境中。所有这些环境都是域成员。

WindowsIdentity.在ASP.NET中随机模拟”;用于模拟的令牌无效-它不能重复;

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

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

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

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