ASP.NET to MSSQL Windows認證時的使用者
其實這個標題下的怪怪的= =",可是我也不知道怎麼改比較好= =。
這篇文章主要是來看使用ASP.NET與資料庫溝通的時候,究竟會用甚麼身份連到資料庫。
如果連線資訊是用SQL認證當然就不會有這樣的問題了。但是如果用Windows認證,在不同的設定下就有可能有不同的結果。
在SQL中利用 SELECT SYSTEM_USER 就可以查詢目前登入SQL的使用者帳號名稱。
接著就來簡單寫一段程式,在網頁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認證。
用administrator登入執行網頁後的結果:
這邊可以發現SQL端抓到的使用者是NETWORK SERVICE,
這裡就會扯到IIS AppPool的部分了,先看一下網站設定
從這裡知道網站所用的是預設的AppPool,到AppPool設定的地方看:
這裡設定的身分識別為網路服務,就是Sql抓到的NETWORK SERVICE了。
試一下指定帳號後看執行結果:
結果:
接著把.NET模擬改成true,<identity impersonate="true" />,其他設定不變,結果:
這次IIS不再使用AppPool指定的User了,變成了網頁登入時所取得的user。
那如果網站開啟的是匿名登入模式呢?這時候他就會去抓匿名登入給定的帳號,在IIS裡可以設定:
執行結果…先死給你看…因為資料庫沒有給他權限囧>
加完權限後的結果:
可以發現到,Web端是抓不到User資訊的。
通常來說,都會使用NETWORK SERVICE就足夠了,除非有時候有特別的需求ˇˇ。
PS:.NET模擬在IIS7上可以直接透過UI調整囧~