男人.No boy no cry

彪悍的人生,不需要解釋...

导航

关于 Impersonate

Posted on 2005-03-23 09:25  Piccolo Goo  阅读(983)  评论(0编辑  收藏  举报

AspNet 有的〈processModel〉username/password和〈identity〉的username/password来模拟用户。

〈processModel〉的username默认为machine,指的是ASPNET这个帐户。这个是指定运行ASPNET_WP.EXE进程的身份。

而当指定〈identity impersonate='true'〉时,则应用IIS当前的帐户信息。

当指定〈identity impersonate='true'〉的username/password时,则固定使用固定的帐户来执行请求。

当然,你也可以在运行时指定用户名和密码来运行指定代码:

不过这里有点问题。如果不是Windows2003的话,那么〈processModel〉的username最好为SYSTEM。否则的话,就要在管理工具-本地安全策略-本地策略-用户权利指派-以操作系统方式操作 里添加运行的用户的权利,我试过Administrators可以,但是如果是以ASPNET来运行的话,则被拒绝。(真麻烦,〈identity〉也用相关的原理来实现模拟,不过不知道它具体是怎样实现的。)

另外,由于〈processModel〉是全局的,而只是针对某一请求的,所以我这里不是太清楚那些ASPNET空间服务的提供商怎样才能保证各空间不能互相访问。

〈processModel〉指定的用户,至少需要有权限访问各网站的web.config才能得到〈identity〉的内容,这就是说,全局用户至少能访问各网站的web.config。那么即使在某个请求中使用了来切换了用户,我只要新开一条线程就能重新用回〈processModel〉指定的用户来运行代码,这时候我也能读取其他网站的web.config了。如果没有更明确的限制,我还能读取其他网站的所有文件。

上面的代码写成一个工具类: