鍍金池/ 教程/ C#/ 安全性
調(diào)試
管理狀態(tài)
Panel 控件
Web 服務(wù)
語言集成查詢
數(shù)據(jù)源
基礎(chǔ)控件
廣告輪轉(zhuǎn)器
服務(wù)器端
服務(wù)器控件
ADO.NET
多線程
HTML 服務(wù)器
生命周期
Ajax 控制
客戶端
異常處理
環(huán)境設(shè)置
部署
個性化
驗(yàn)證器
多視圖
日歷
文件上傳
ASP.NET - 數(shù)據(jù)綁定
數(shù)據(jù)庫存取
實(shí)例
自定義控件
簡介
配置
數(shù)據(jù)緩存
安全性
指令
事件處理

安全性

實(shí)現(xiàn)網(wǎng)站的安全性關(guān)系到如下幾方面:

  • 身份認(rèn)證:即確認(rèn)用戶身份和真實(shí)性的過程。ASP.NET 中提供了四種類型的認(rèn)證:
    • Windows 認(rèn)證
    • 表單認(rèn)證
    • 身份驗(yàn)證
    • 自定義認(rèn)證
  • 授權(quán):即定義并為特定用戶分配特定角色的過程。
  • 機(jī)密性:包括對客戶端瀏覽器和網(wǎng)絡(luò)服務(wù)器的加密。
  • 完整性:保持?jǐn)?shù)據(jù)完整性。例如,實(shí)現(xiàn)數(shù)字簽名。

基于表單的認(rèn)證

一般來講,基于表單的認(rèn)證包括編輯網(wǎng)絡(luò)配置文件以及具有驗(yàn)證碼的注冊頁面。
網(wǎng)絡(luò)配置文件可由如下代碼編寫:

<configuration>

<system.web>
    <authentication mode="Forms">
        <forms loginUrl ="login.aspx"/>
    </authentication>

    <authorization>
        <deny users="?"/>
    </authorization>
</system.web>
...
...
</configuration>

上面的代碼段中提及的 login.aspx 頁面可能會包含如下代碼,包含驗(yàn)證用的用戶名和密碼在文件之后很難編碼進(jìn)去。

protected bool authenticate(String uname, String pass)
{
    if(uname == "Tom")
    {
        if(pass == "tom123")
            return true;
    }

    if(uname == "Dick")
    {
        if(pass == "dick123")
            return true;
    }

    if(uname == "Harry")
    {
        if(pass == "har123")
            return true;
    }

    return false;
}

public void OnLogin(Object src, EventArgs e)
{
    if (authenticate(txtuser.Text, txtpwd.Text))
    {
        FormsAuthentication.RedirectFromLoginPage(txtuser.Text, chkrem.Checked);
    }
    else
    {
        Response.Write("Invalid user name or password");
    }
}

注意到 FormsAuthentication 類是用于認(rèn)證過程的。

然而,不用寫任何代碼 Visual Studio 就能夠通過網(wǎng)站管理工具輕松地?zé)o縫實(shí)現(xiàn)用戶創(chuàng)建、身份認(rèn)證和授權(quán)。這種工具能夠?qū)崿F(xiàn)用戶和角色的創(chuàng)建。

除此之外,ASP.NET 有現(xiàn)成的登錄控制系列,可以為你控制執(zhí)行所有的工作。

基于表單的安全性的實(shí)現(xiàn)

為了建立基于表單的認(rèn)證,你需要做到如下幾點(diǎn):

  • 支持認(rèn)證過程的用戶數(shù)據(jù)庫
  • 一個使用數(shù)據(jù)庫的網(wǎng)站
  • 用戶賬戶
  • 角色
  • 用戶活動和群體活動的限制
  • 一個顯示用戶狀態(tài)及其他信息的用戶頁面
  • 允許用戶登錄、找回密碼、修改密碼的登錄界面。

為了創(chuàng)建一個用戶,需要采取以下步驟:

第一步:選擇網(wǎng)站 -> 配置 ASP.NET 以打開網(wǎng)絡(luò)應(yīng)用管理工具。

第二步:點(diǎn)擊安全選項(xiàng)。

http://wiki.jikexueyuan.com/project/asp-net/images/security_tab.jpg" alt="security_tab.jpg" />

第三步:選擇 'Forms based authentication' 選項(xiàng),以將認(rèn)證類型設(shè)定為 'From the Internet'。

http://wiki.jikexueyuan.com/project/asp-net/images/authentication_type.jpg" alt="authentication_type.jpg" />

第四步:點(diǎn)擊 'Create Users'。如果你已經(jīng)創(chuàng)建了角色,你正好可以在這一步把角色分配給該用戶。

http://wiki.jikexueyuan.com/project/asp-net/images/create_users_link.jpg" alt="create_users_link.jpg" />

第五步:創(chuàng)建一個網(wǎng)站,并添加如下頁面:

  • 歡迎頁面
  • 登錄頁面
  • 注冊頁面
  • 找回密碼頁面
  • 修改密碼頁面

第六步:在歡迎頁面的登錄部分設(shè)置一個登錄狀態(tài)控件。包含兩個標(biāo)準(zhǔn)框:LoggedIn 和 LoggedOut。

LoggedIn 有查看已經(jīng)登錄用戶的選項(xiàng),LoggedOut 內(nèi)有查看已經(jīng)退出用戶的選項(xiàng)。你可以在屬性窗口里改變登錄和退出的文本屬性。

http://wiki.jikexueyuan.com/project/asp-net/images/login_status_control.jpg" alt="login_status_control.jpg" />

第七步:在 LoginStatus 控件的下面設(shè)置一個 LoginView 控件。你可以在此設(shè)置一些能反應(yīng)用戶是否已經(jīng)登錄的其他文本或其他控件(如超鏈接、按鈕等)。

這個控件有兩個標(biāo)準(zhǔn)框: Anonymous 框和 LoggedIn 框。選擇每種視圖,并為用戶編寫一些文本,以作為選擇標(biāo)準(zhǔn)框時要顯示的內(nèi)容。文本應(yīng)該被放在如下圖中標(biāo)紅的區(qū)域。

http://wiki.jikexueyuan.com/project/asp-net/images/login_view_control.jpg" alt="login_view_control.jpg" />

第八步:由開發(fā)者創(chuàng)建應(yīng)用用戶。你也許想要允許游客也能夠創(chuàng)建一個用戶賬戶。要實(shí)現(xiàn)這個,你可以在 LoginView 控件下添加一個可以轉(zhuǎn)到注冊頁面的鏈接。

第九步:在注冊頁面設(shè)置一個 CreateUserWizard 控件。設(shè)置這個控件的 ContinueDestinationPageUrl 屬性,以保證能夠轉(zhuǎn)到歡迎頁面。

http://wiki.jikexueyuan.com/project/asp-net/images/createuserwizard_control.jpg" alt="createuserwizard_control.jpg" />

第十步:創(chuàng)建登錄頁面。在這個頁面上設(shè)置一個 Login 控件。 LoginStatus 控件會自動地連接到登錄頁面。在網(wǎng)絡(luò)配置文件里做如下改動可以改變這種默認(rèn)設(shè)置。

例如,如果你把你的登錄頁面命名為 signup.aspx ,可以在網(wǎng)絡(luò)配置文件的 部分添加如下幾行代碼。

<configuration>
    <system.web>
        <authentication mode="Forms">
            <forms loginUrl ="signup.aspx" defaultUrl = a€?Welcome.aspxa€? />
        </authentication>
    </system.web>
</configuration>

第十一步:用戶經(jīng)常會忘記密碼。PasswordRecovery 控件幫助用戶重新獲得登錄這個賬戶。選擇登錄控件。打開它的小標(biāo)簽,并選擇 'Convert to Template'。

通過自定義這個控件的用戶界面,在登錄按鈕下方放置一個超鏈接控件,這個控件應(yīng)該是能夠鏈接到找回密碼頁面的。

http://wiki.jikexueyuan.com/project/asp-net/images/passwordrecovery_control.jpg" alt="passwordrecovery_control.jpg" />

第十二步:在找回密碼頁面設(shè)置一個 PasswordRecovery 控件。這個控件需要郵件服務(wù)器把密碼發(fā)送給用戶。

http://wiki.jikexueyuan.com/project/asp-net/images/passwordrecovery_control2.jpg" alt="passwordrecovery_control2.jpg" />

第十三步:在歡迎頁面的 LoginView 控件的 LoggedIn 框內(nèi)設(shè)置一個轉(zhuǎn)到修改密碼頁面的鏈接。

http://wiki.jikexueyuan.com/project/asp-net/images/changepassword_control.jpg" alt="changepassword_control.jpg" />

第十四步:在修改密碼頁面設(shè)置一個 ChangePassword 控件,這個控件有兩種視圖:

http://wiki.jikexueyuan.com/project/asp-net/images/changepassword_control2.jpg" alt="changepassword_control2.jpg" />

現(xiàn)在運(yùn)行這個應(yīng)用,觀察不同的安全操作。
可以回到網(wǎng)絡(luò)應(yīng)用管理工具,點(diǎn)擊安全選項(xiàng),來創(chuàng)建角色。點(diǎn)擊 'Create Roles' 為這個應(yīng)用來創(chuàng)建一些角色。

http://wiki.jikexueyuan.com/project/asp-net/images/web_application_administration.jpg" alt="web_application_administration.jpg" />

點(diǎn)擊 'Manage Users',可以給用戶分配角色。

http://wiki.jikexueyuan.com/project/asp-net/images/manage_users.jpg" alt="manage_users.jpg" />

IIS 認(rèn)證:SSL

安全套接層(SSL)是用來確保安全連接的協(xié)議。通過使用 SSL,瀏覽器會把送到服務(wù)器的所有數(shù)據(jù)加密,并解密來自服務(wù)器的所有數(shù)據(jù)。與此同時,服務(wù)器也會對倆字瀏覽器的所有數(shù)據(jù)進(jìn)行加解密。

安全連接的 URL 使用的是 HTTPS 協(xié)議而不是 HTTP 協(xié)議。一個很小的加鎖也會被使用了安全連接的瀏覽器顯示出來。當(dāng)瀏覽器使用 SSL 主動地與服務(wù)器進(jìn)行交流時,服務(wù)器會發(fā)送一個安全證書以對服務(wù)器本身進(jìn)行認(rèn)證。

要想使用 SSL ,你需要從一個可以信任的認(rèn)證機(jī)構(gòu)(CA)購買一個數(shù)字安全證書,并在網(wǎng)絡(luò)服務(wù)器上安裝這個證書。以下是一些可以信任的,有較好名譽(yù)認(rèn)證機(jī)構(gòu):

  • www.verisign.com
  • www.geotrust.com
  • www.thawte.com

SSL 是建立在所有主要的瀏覽器和服務(wù)器上的。要啟用 SSL,你需要安裝數(shù)字證書。不同數(shù)字證書的強(qiáng)度不同,是根據(jù)加密過程中產(chǎn)生的密鑰長度而有所區(qū)別。密鑰越長,證書就越安全,連接也就越安全。

強(qiáng)度 描述
40 比特 支持大多數(shù)瀏覽器但是很容易破解。
56 比特 比 40 比特的更健壯。
128 比特 很難破解,但并不是所有的瀏覽器都支持。