艾锑知识 |关于网站应用程序池的帐号密码更改及其影响的实例分析

| 2020-03-02 13:28:29    标签:

 凝心聚力,决战当下,让三月成为值得记念的日子

 

 1.jpg

 

   如果二月份因为疫情在家,你没有体验到春风似剪刀的感觉。
   那三月份很快就要来了,你会迎着小雨一边走一边唱着歌吗?
   在二月里你是怎样度过的?你的企业复工了吗?
   这一个月留在你生命中有哪些难忘的记忆呢?
   从二月三号开始,艾锑无限小伙伴就进入了自己的工作状态:
   有的人因为封城一直在家远程为客户提供服务,
   有的人回到北京被隔离14天在自己住的地方给客户提供服务,
   有的人春节只休了7天假期就早早回到了北京,
   有的人从未离开过北京人,所以他们才能在二月工作26天。
   每一种选择都是选择,每一种人生都是人生。
   我们期望回首2020年的时候,可以自豪的对自己说,
   生命中的每一天,都是最好的一天,
   感恩所有人,感恩一切的发生,感恩逝去的那些日子
.

   三月是一个全新的开始,送上一篇可以帮你解决技术难题的文章,让你更好的投入全新的工作状态:

 

 

艾锑知识 |关于网站应用程序池的帐号密码更改及其影响的实例分析

实例场景

·       我们有一个网站(名称为test),它使用了一个应用程序池(名称也为test)

1.png

·       这个应用程序池所使用的用户帐号为app_pool_test

2.png

·       这个帐号当前的密码,假设为 abc 。当我设置好之后,我可以正常打开网站

3.png

这个演示页面的功能很简单,我是使用下面的代码去访问了一下数据库

复制代码 代码如下:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
namespace WebApplication1
{
public partial class _default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
using(var conn = new SqlConnection("server=(local)\\\\sqlexpress;database=northwind;integrated security=true"))
{
conn.Open();
Response.Write(conn.State.ToString());
}
}
}
}

 

请注意,这里我并没有指定用户名和密码,而是使用了integrated security=true。这通常称为信任连接或者集成验证。这个问题,我下面还会解释。

 

大家可以看到,网站能正常工作。功能没有什么了不起的,这是一个简单的演示而已。但是下面大家思考一个问题:

假设app_pool_test 这个帐号的密码因为什么原因需要修改(这个很正常,很多公司都有密码修改策略的),那么

1.网站还是否能正常打开?

2.数据库还是否能访问?

 

我这里就做一个测试,我现在将帐号的密码修改掉

4.png

奇怪的是,我们会发现网站照样能打开,数据库居然也照样能访问得上。

5.png

首先,这里你应该会有一个疑问:这是为什么呢?难道改了密码没有生效吗?到底什么时候会生效呢?

我们接下去做实验。假使当前这个服务器,因为某种原因(例如安装补丁包),需要重新启动。或者你自己因为某个原因,需要对IIS进行重启,例如执行了下面的命令

6.png

然后,我们再次尝试打开刚才那个网页,就会发现如下的错误

7.png

一般而言,503错误都是表示后台的Application Pool存在问题,我们到IIS中查看,确实发现它被停止了

8.png

而且你还会发现,无论你如何启动,只要页面刷新一下,它就又停止了。

除非,你再次在它这里将正确的用户名和密码设置一次。

9.png

然后,你会发现网站能正常工作了

10.png

 

 

我希望你看懂了我想要描述的一个问题:当网站的应用程序池帐号密码被修改之后,将如何影响到当前的网站。

先将结论给大家说一下

1. 如果当前的网站,没有被重置。我测试下来是,只要IIS没有被重启过,或者应用程序池没有被停止过,就可以继续使用。

2. 否则,当前网站会无法正常工作,而且应用程序池再也无法启动,除非设置正确的密码。

 

那么,这是为什么呢?

1. IIS启动的时候,默认会启动所有的应用程序池,并且使用它们的标识和密码,去请求windows系统(可能是本机,也可能是AD)进行认证

2. 只要认证通过了,那么应用程序池将启动,而且这个身份会被缓存起来。

3. 一般的应用程序,要访问后台数据库的时候,如果选择了集成验证(integrated security=true)”这种方式的话,那么就是使用应用程序池的这个身份。

4. “集成验证有时候也称为信任连接,这是什么意思呢?就是说SQL Server其实不再对帐号和密码进行验证,它信任”windows传递过来的身份,也就是说,只要上面的第2步通过了,确实帐号是app_pool_test,那么SQL Server就认为它是app_pool_test,而不再重复验证密码。

5. IIS被重启,或者应用程序池被重启,此时就需要再次验证身份。而如果此时发现密码不匹配了,就自然无法启动应用程序池,然后也自然无法启动网站,然后也不会发生访问数据库的行为。