我有一个asp.net应用程序,它要求用户使用基本身份验证使用其域帐户登录。用户可以进行选择,然后按按钮。
在按下按钮后的某个时刻,该代码为:WindowsIdentity.Impersonate(userIdentity.Token)
。user identity的类型是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已验证)
在system.security.principal.windowsIdentity.impersonate(intptr usertoken)
在C:\ dev\roomres\resource booker\bll\reservationagent.cs:第101行中的resource_booker.bll.reservationagent.submitreservationrequest(reservation reservation,patron patron)
在resource_booker.reserve.reserve_单击c:\ dev\roomres\resource booker\reserve.aspx.cs中的(对象发送者,事件参数e):第474行
在system.eventhandler.invoke(对象发送者,eventargs e)
在system.web.ui.webcontrols.button.raisepostbackevent(string eventargument)
在system.web.ui.page.processrequestmain(布尔值includestagesbeforeasyncpoint,布尔值includestagesafterasyncpoint)
这里有一个令人困惑的因素:我不能在本地Windows7x64工作站上重现这个问题——尽管我的身份验证是在这里隐式传递的,因为我使用的是本地主机——或者在Windows2003 32位IIS6.0环境中。它只发生在一个非常普通的Windows2008R2环境中。所有这些环境都是域成员。
最佳答案
基本上,您看到的并不是一个安全问题,因为登录会话在TCP连接的生命周期内由IIS缓存,但是HTTP偶尔会切断需要重新验证的TCP连接。这将无缝且不可见地发生(由浏览器处理),但它将使令牌无效,因为登录会话将在TCP连接结束时被破坏。
也就是说,为了@usr的利益,它只在某些时候起作用,因为登录会话是相同的,所以令牌是相同的,所以存储在会话中的令牌起作用,因为它恰好是与user.identity相同的实际令牌。这不是避免安全检查的方法,而是安全检查的实现细节。
您不应该在会话中存储标识-这是不必要的,因为它是经过身份验证的连接。
每次使用(WindowsIdentity)User.Identity
你的问题就会消失。