【发布时间】:2011-10-07 11:32:53
【问题描述】:
我对 ASP.NET 和 IIS 中的各种不同身份感到有些困惑。有谁能告诉我应用程序池身份、匿名身份、ProcessModel 身份、模拟身份和线程身份之间的确切区别吗?还请告诉我 asp.net 何时使用哪个身份?
【问题讨论】:
标签: asp.net security iis identity
我对 ASP.NET 和 IIS 中的各种不同身份感到有些困惑。有谁能告诉我应用程序池身份、匿名身份、ProcessModel 身份、模拟身份和线程身份之间的确切区别吗?还请告诉我 asp.net 何时使用哪个身份?
【问题讨论】:
标签: asp.net security iis identity
IIS 是一种 Web 服务器,可以托管除 ASP.NET 之外的主动/被动内容(例如,经典的 asp、php、静态文件等)。应用程序池标识决定从 IIS 角度运行请求的用户。因此,当将提供静态文件(html/image)时,该用户将用于从磁盘访问文件。很多时候,IIS 会将请求的实际执行交给不同的处理程序(例如,php-cgi 或 ASP.NET 运行时等)。该运行时可能使用不同的身份来运行请求。在 windows 身份验证的情况下,IIS 会将 windows 用户令牌传递给特定的处理程序,并且处理程序可以模拟当前请求以在该经过身份验证的用户身份下运行。 Classic ASP 就是这样一种系统。在这些情况下,当用户未通过身份验证(即匿名)时,将使用匿名用户的身份。
在 ASP.NET 的情况下,默认配置将以应用程序池的身份运行请求。但是,使用配置,您可以指示 ASP.NET 运行时模拟当前用户的身份。您还可以通过配置来配置以特定身份模拟请求 - 通常这是在应用程序代码需要具有特定访问权限(例如访问文件共享、网络资源等)的情况下完成的。
【讨论】:
进程模型标识仅适用于 IIS 5.*。在 IIS 6+ 中,它的等价物是应用程序池标识。
创建工作进程时,使用进程模型/应用程序池标识作为进程标识。
当允许匿名访问时,匿名身份将用作处理工作进程内传入请求的所有线程的线程身份。其他线程的身份取决于它们的创建方式,并且对开发人员/最终用户是透明的。
当使用其他身份验证方法(例如 Windows 身份验证)时,工作线程身份使用经过身份验证的用户身份(每个传入请求可能来自经过身份验证的用户,然后此用户的身份用于处理请求的线程)。
模拟要复杂得多,如
中所述http://msdn.microsoft.com/en-us/library/aa376391(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/ff647404.aspx
它改变了安全上下文,这不是一个易于理解的 Windows 概念,您可以从好书或实验中学习。
【讨论】: