我正在编写一个利用声明来确保安全的自定义 .Net 应用程序,因为我们正在跨越许多边界 - Web、API、批处理等。在开发过程中,有时我会在通过 Chrome 登录时在系统中创建一些内容,然后我会通过 Edge 中的另一个帐户来测试新创建的项目,并且以某种方式HttpContext.Current.User.Identity
对应于我的 Chrome 会话。我确实设置了Thread.CurrentPrincipal
在幕后,但我的理解一直是所有进入 IIS 的请求都会产生一个新线程,所以我无法弄清楚为什么 Edge 请求会像 Chrome 请求一样被处理。
是否有可能因为 Visual Studio 处于调试模式而共享此信息?
IIS(以及 IISExpress,它是以“应用程序”格式打包的 IIS)是多线程的。但是,您做出了一些错误的假设。
首先,不。新请求不会生成新线程,它在线程池线程上运行,并且在前一个请求完成后(或者,正如您稍后将看到的,当异步请求等待时)重新使用这些线程池。
其次,你不应该设置Thread.CurrentPrincipal
,因为 IIS 不仅是多线程的,而且是异步的。这意味着,如果您的线程等待,当它恢复时,它可能会在与其启动的线程不同的线程上运行。
Third, Thread.CurrentPrincipal
通常是工作进程(或AppPool)身份的身份,更改此身份会更改整个线程运行的安全上下文。更好的选择是使用WindowsImpersonationContext
类来进行模拟(这就是我假设你正在尝试做的事情)。
WindowsIdentity clientId = (WindowsIdentity)User.Identity;
// When 'using' block ends, the thread reverts back to previous Windows identity,
// because under the hood WindowsImpersonationContext.Undo() is called by Dispose()
using (WindowsImpersonationContext wic = clientId.Impersonate())
{
// do your work that needs the identity
}
如果您确实需要设置自定义主体,您通常应该使用HttpContext.Current.User
而不是 Thread.CurrentPrincipal。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)