如何在ASP.NET應用中整合Windows域帳戶來進行許可權控制
公司專屬應用程式程式採用域使用者來代替獨立的使用者管理模組的好處很多。
- 程式本身不需要單獨編寫使用者帳號管理模組
- 與域使用者整合,使用者不需要單獨記憶使用者名稱口令,可以實現無縫登入
- 採用域使用者方案安全性提升,認證時口令不在網上傳輸,域使用者安全層級
- 其他好處多多
首先需要配置IIS:
為你的應用單獨建立一個web虛擬目錄,右鍵選擇屬性裡的目錄安全,許可權與存取控制,把“開啟匿名訪問”不選,僅僅選擇“整合Windows許可權認證”,別的都不要選,確定。
整合域使用者來控制使用者訪問的途經有兩種,一種是利用NTFS許可權控製表,缺點是每次轉移應用之後,需要逐個設定目錄存取權限。另外一種是通過配置web.config檔案,通過URL來控制,好處是直接修改設定檔就可以了,不需要每次發布應用時變換一次目錄就修改一次。下面我就主要介紹一個後者。
劃應用分類樹:
根目錄的使用權限設定覆蓋子目錄的設定,把管理頁面單獨放在一個路徑下,比如在根目錄下設定一個admin子目錄管理頁面都放在這下面;再設定一個sales的子目錄,只有銷售的同志可以訪問,user則是任何人都可以訪問。舉例如下:
\root\
\root\admin
\root\sales
\root\user
修改設定檔:
在需要進行許可權配置的目錄下面,分別建立web.config檔案。root下面肯定需要一個設定檔了,在本例中由於admin路徑下放置了管理頁面,因此我在admin下面也建立了一個web.config設定檔。
root下的web.config設定檔的和許可權相關的內容如下:
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="APPConnectionString" connectionString="Data Source=MachineName;Initial Catalog=DatabaseName;Integrated Security=SSPI"
</connectionStrings>
<system.web>
<authentication mode="Windows" />
<!--<identity impersonate="true" userName="UserName" password="PassWord" />-->
<identity impersonate="true"/>
<authorization>
<allow roles="UserName,domainname\username1,domainname\username2,domainname\usergroup1" />
<deny users="*"/>
</authorization>
</system.web>
</configuration>
admin目錄下也增加一個web.config檔案 (sales目錄下設定檔類似,就是允許sales的賬戶訪問該目錄即可)
<?xml version="1.0"?>
<configuration>
<system.web>
<authorization>
<allow roles="domainname\username1,domainname\usergroup1" />
<deny users="*"/>
</authorization>
</system.web>
</configuration>
首先,先解釋一下admin下面的這個設定檔,我允許domainname\username1訪問這個管理目錄,而禁止任何其他的使用者來訪問這些功能頁面。
下面,再接是一下root下面的這個設定檔,我增加了一個連結資料庫的字串,採用的是MS推薦的安全連線,沒有使用sa之類的SQL管理的賬戶。
authentication mode="Windows" 的意思是整合域使用者,這句話是開啟應用支援域使用者的關鍵。
allow roles=",,," 列表裡面我規定了可以訪問root的使用者,每個使用者之間用逗號分隔,這裡可以指定伺服器本機使用者,也可以指定域使用者,或者域使用者組
deny users=",,," 列表裡我規定了禁止所有使用者訪問(允許清單裡的使用者除外)
以上這兩個類表可以使用的萬用字元有 ? 匿名使用者, * 所有使用者
到目前為止,其實就已經算是完成了,就這麼簡單。
使用者代理程式
Impersonate,除非有特殊要求,比如在同一個伺服器上運行同一個應用,需要區別不同公司的操作,可以分別建立應用程式集區,採用不同代理帳號,來區分訪問,否則,這個代理賬戶是不需要的(而且會引起效能下降),這個代理使用者現象預設是關閉的。
如果不採用使用者代理程式,每次使用者登入應用的時候,系統自動匹配目前使用者登入所使用的用戶端的域使用者名稱
如果採用使用者代理程式,就是指定一個代理使用者,代理所有表現曾使用者的一切操作請求。
可以用下面的配置指定固定的代理使用者
<identity impersonate="true" userName="UserName" password="PassWord" />
或者採用下面的設定,指定應用程式集區的使用者作為代理
<identity impersonate="true" />
預設情況下,這個使用者代理程式是關閉的,缺點也不少,MS不推薦使用,所以,你就跳過這部分吧。
下面說一下如何採用信任賬戶去連結SQL資料庫
這一部分,實際上用的很廣泛,MSDN有專門的一篇來講解這個,你可以參考,
http://msdn.microsoft.com/en-us/library/ms998292.aspx
如果使用了sa或者其他SQL管理的使用者帳號,那實際上我就把口令寫到了設定檔裡面,這樣安全性不好。當然微軟也提供了補救辦法,就是可以使用一個命令列加密工具把設定檔加密成密文,總之是不好了,那怎麼使用信任連接串連資料庫呢?設定檔照著下面寫,
<connectionStrings>
<add name="ConnectionStringName" connectionString="Data Source=ServerName;Initial Catalog=DatabaseName;Integrated Security=SSPI" providerName="System.Data.SqlClient" />
</connectionStrings>
下一步是怎麼配置這個信任的使用者的許可權,這個賬戶必須同時具有運行IIS應用的許可權,和訪問SQL的許可權。一般可以指定一個特定的建立使用者,當然,為了簡化配置,如果web伺服器和SQL伺服器都在一台機器上,也可以使用預置好的服務帳戶NT AUTHORITY\NETWORK SERVICE,否則你就需要建立一個域使用者了,格式可以是domainname\webmachinename。然後就是分配給這個使用者訪問SQL的許可權。
給應用指定運行使用者
建立一個新的應用程式集區,右鍵選擇屬性,identity使用者表示裡面,把匿名使用者去掉,在下面選擇使用者,可以選擇你上面建立的使用者,也可以使用NT AUTHORITY"NETWORK SERVICE。
在代碼中調用域使用者權限
在代碼使用如下代碼來查看訪問者域使用者身份。
Page.User.Identity.Name
Page.User.Identity.IsAuthenticated
增加引用using System.Security.Principal;
使用如下代碼查看採用信任鏈結接 方式同一訪問SQL的使用者身份,也就是你在應用程式集區裡指定的那個使用者名稱。
WindowsIdentity.GetCurrent().Name
如有錯誤,歡迎批評指正。
下面表徵圖說明了應用程式層採用Windows使用者進行安全認證,應用程式層和資料服務器之間則採用信任鏈結接統一訪問的原理。