ASP.NET to MSSQL Windows認證時的使用者

ASP.NET to MSSQL Windows認證時的使用者

其實這個標題下的怪怪的= =",可是我也不知道怎麼改比較好= =。

這篇文章主要是來看使用ASP.NET與資料庫溝通的時候,究竟會用甚麼身份連到資料庫。

如果連線資訊是用SQL認證當然就不會有這樣的問題了。但是如果用Windows認證,在不同的設定下就有可能有不同的結果。

在SQL中利用 SELECT SYSTEM_USER  就可以查詢目前登入SQL的使用者帳號名稱。

image

 

接著就來簡單寫一段程式,在網頁Page Load時:

            string connectionString="Data Source=.;Initial Catalog=Test;Integrated Security=True";
            string sqlCommand="SELECT SYSTEM_USER";
            SqlConnection conn = new SqlConnection(connectionString);
            SqlCommand cmd = new SqlCommand(sqlCommand, conn);
            conn.Open();
            string sqluser=cmd.ExecuteScalar().ToString();
            cmd.Dispose();
            conn.Close();
            conn.Dispose();

            //網頁上取得的User資訊
            string webuser =Page.User.Identity.Name;

            Response.Write("WebUser: " + webuser + @"<br/>");
            Response.Write("SqlUser: " + sqluser + @"<br/>");

再來就是把網站放到IIS上去囉。以下是以IIS6來測試。

首頁先把Web.Config開啟,確認有沒有這行:

<identity impersonate="false" />

這個代表是否要啟用ASP.NET模擬使用者。稍後會來看這個部分,

如果是True就先改成false。將這行放到<system.web>區段內。

將IIS網站的認證模式只開啟Windows認證。

image

 

用administrator登入執行網頁後的結果:

image

這邊可以發現SQL端抓到的使用者是NETWORK SERVICE,

這裡就會扯到IIS AppPool的部分了,先看一下網站設定

 

image

從這裡知道網站所用的是預設的AppPool,到AppPool設定的地方看:

image

這裡設定的身分識別為網路服務,就是Sql抓到的NETWORK SERVICE了。

試一下指定帳號後看執行結果:

image

結果:

image

接著把.NET模擬改成true,<identity impersonate="true" />,其他設定不變,結果:

image

這次IIS不再使用AppPool指定的User了,變成了網頁登入時所取得的user。

 

那如果網站開啟的是匿名登入模式呢?這時候他就會去抓匿名登入給定的帳號,在IIS裡可以設定:

image

執行結果…先死給你看…因為資料庫沒有給他權限囧>

image

加完權限後的結果:

image

可以發現到,Web端是抓不到User資訊的。

通常來說,都會使用NETWORK SERVICE就足夠了,除非有時候有特別的需求ˇˇ。

 

PS:.NET模擬在IIS7上可以直接透過UI調整囧~

image