最近开发的项目用到了带有cer证书的RSA加密解密。程序在本机测试一直很好,可是部署到服务器上却报了错。调试了一个晚上,没有任何进展。。。。。第二天早上来,继续调试,仍然无果。直到下午,一次偶然的操作,发现了有可能是应用程序池的问题,然后果断换了一个应用程序池试了下,结果竟然对了。。。于是开始检查前后连个应用程序池的区别,发现原因在于应用程序池的标识上。于是将原有的应用程序池标识ApplicationPoolIdentify改为LocalSystem,问题解决。后来上网查询资料发现可能是权限问题。
IIS有应用程序池有四种标识LocalService,LocalSystem,NetWorkService,ApplicationPoolIdentify。
1.Local System (本地系统): 该账户具有相当高的权限。 首先,该账户也隶属于本地Administrators 用户组,因此所有本地Administrators用户能够进行的操作该账户也能够进行, 其次,该账户还能够控制文件的权限(NTFS 文件系统)和注册表权限,甚至占据所有者权限来取得访问资格。 如果机器处于域中,那么运行于Local System 账户下的服务还可以使用机器账户在同一个森林中得到其他机器的自动认证, 最后一点就是运行于Local System 下的进程能够使用空会话(null session)去访问网络资源。 而且,其他一些Windows 用户模式下的核心组件也运行于该账户下,例如system32\Smss.exe 等。 需要注意的是,运行于此账户下的进程使用的是HKEY_USERS\.Default 账户配置,因此它不能够访问其他账户的配置。
2.Network Service(网路服务): 该账户也是为了使用机器账户在网络上的其他计算机上认证而设定的。但是他没有Local System 那么多的权限。 它能够以计算机的名义访问网络资源。以这个账户运行的服务会根据实际环境把访问凭据提交给远程的计算机。 运行于此账户下的进程使用网络账户配置文件HKEY_USERS\S-1-5-20和Documents and Settings\NetworkService。
3.Local Service(本地服务): Local Service账户是预设的拥有最小权限的本地账户,并在网络凭证中具有匿名的身份。 运行于此账户下的进程和运行于Network Service 账户下的进程的区别 在于运行于Local Service 账户下的进程只能访问允许匿名访问的网络资源。 运行于Local Service 下的账户使用的配置文件是HKU\S-1-5-19 和Documents and Settings\LocalService。
4.ApplicationPoolIdentity"帐号是系统动态创建的“虚拟”帐号(说它是虚拟的,是因为在用户管理里看不到该用户或用户组,在命令行下输入net user也无法显示,但该帐号又是确实存在的)
后来调试发现,应用程序池标识在ApplicationPoolIdentity下,更改应用程序池的高级设置里的模型里的加载用户配置文件改为true也可以解决问题。