共用方式為


將安全性和成員資格新增至 ASP.NET Web Pages (Razor) 網站

作者:Tom FitzMacken

本文說明如何保護 ASP.NET Web Pages (Razor) 網站的安全,讓某些頁面僅適用于登入的人員。 (您也會瞭解如何建立任何人都可以存取的頁面。)

您將瞭解的內容:

  • 如何建立具有註冊頁面和登入頁面的網站,讓某些頁面只能存取成員。
  • 如何建立公用和僅限成員的頁面。
  • 如何定義角色,也就是您網站上具有不同安全性許可權的群組,以及如何將使用者指派給角色。
  • 如何使用 CAPTCHA 來防止自動化程式 (Bot) 建立成員帳戶。

以下是文章中引進的 ASP.NET 功能:

  • WebMatrix 入門網站 範本。
  • 協助 WebSecurity 程式和 Roles 類別。
  • 協助 ReCaptcha 程式。

教學課程中使用的軟體版本

  • ASP.NET Web Pages (Razor) 2
  • WebMatrix 3
  • ASP.NET Web 協助程式程式庫

您可以設定您的網站,讓使用者能夠登入它,也就是網站支援 成員資格。 基於許多原因,這非常有用。 例如,您的網站可能有僅可供成員使用的頁面。 在某些情況下,您可能需要使用者登入,才能傳送意見反應或留下批註。

即使您的網站支援成員資格,使用者也不一定要登入,才能使用網站上的某些頁面。 未登入的使用者稱為 匿名使用者

使用者可以在您的網站上註冊,然後可以登入網站。 網站需要使用者名稱 (電子郵件地址) 和密碼,以確認使用者是他們所宣告的使用者。 此登入和確認使用者的身分識別程式稱為 驗證

您可以透過不同的方式設定安全性和成員資格:

  • 如果您使用 WebMatrix,最簡單的方法是根據 入門網站 範本建立為新網站。 此範本已針對安全性和成員資格進行設定,而且已經有註冊頁面、登入頁面等等。

    範本所建立的網站也有選項可讓使用者使用 Facebook、Google 或 Twitter 等外部網站登入。

  • 如果您想要將安全性新增至現有的網站,或不想使用 入門網站 範本,您可以建立自己的註冊頁面、登入頁面等等。

本文著重于第一個選項, 如何使用 入門網站 範本來新增安全性。 它也提供有關如何實作您自己的安全性的一些基本資訊,然後提供有關如何執行此作業的詳細資訊連結。 另外還有有關如何啟用外部登入的資訊,在個別的文章中會更詳細地說明。

使用入門網站範本建立網站安全性

在 WebMatrix 中,您可以使用 入門網站 範本來建立包含下列專案的網站:

  • 用來儲存成員使用者名稱和密碼的資料庫。
  • 匿名 (新) 使用者可以註冊的註冊頁面。
  • 登入和登出頁面。
  • 密碼復原和重設頁面。

下列程式說明如何建立月臺並加以設定。

  1. 啟動 WebMatrix,然後在 [快速入門] 頁面中,選取 [ 網站來源範本]。

  2. 選取 [入門網站 ] 範本,然後按一下 [ 確定]。 WebMatrix 會建立新的網站。

  3. 在左窗格中,按一下 [ 檔案 ] 工作區選取器。

  4. 在網站的根資料夾中,開啟 _AppStart.cshtml 檔案,這是用來包含全域設定的特殊檔案。 它包含一些語句,這些語句會使用 // 字元標記為批註:

    //WebMail.SmtpServer = "mailserver.example.com";
    //WebMail.EnableSsl = true;
    //WebMail.UserName = "username@example.com";
    //WebMail.Password = "your-password";
    //WebMail.From = "your-name-here@example.com";
    

    這些語句會設定 WebMail 協助程式,可用來傳送電子郵件。 成員資格系統可以在使用者註冊或想要變更密碼時,使用電子郵件傳送確認訊息。 (例如,在使用者註冊之後,他們會收到包含可按一下的連結的電子郵件,以便完成註冊程式。)

    傳送電子郵件需要存取 SMTP 伺服器,如將Email新增至 ASP.NET Web Pages網站中所述。 您將在此中央 _AppStart.cshtml 檔案中儲存電子郵件設定,因此您不需要重複地將電子郵件編碼到可傳送電子郵件的每個頁面中。 (您不需要設定 SMTP 設定來設定註冊資料庫;如果您想要從其電子郵件別名驗證使用者,並讓使用者重設忘記的密碼,則只需要 SMTP 設定。)

  5. 從每個語句前面移除 // ,以取消批註語句。

    如果您不想設定電子郵件確認,可以略過此步驟和下一個步驟。 如果未設定 SMTP 值,則會立即提供新的帳戶,而不需確認電子郵件。

  6. 在程式碼中修改下列電子郵件相關設定:

    • 設定 WebMail.SmtpServer 為您可以存取之 SMTP 伺服器的名稱。

    • 保留 WebMail.EnableSsl 設定為 true 。 此設定會藉由加密認證來保護傳送至 SMTP 伺服器的認證。

    • 設定 WebMail.UserName 為 SMTP 伺服器帳戶的使用者名稱。

    • 設定 WebMail.Password 為 SMTP 伺服器帳戶的密碼。

    • 設定 WebMail.From 為您自己的電子郵件地址。 這是郵件從中傳送的電子郵件地址。

      注意

      提示如需這些屬性值的詳細資訊,請參閱自訂Site-Wide行為中的設定Email設定 ASP.NET Web Pages

  7. 儲存並關閉 _AppStart.cshtml

  8. 在瀏覽器中執行 Default.cshtml 頁面。

    security-membership-2

    注意

    如果您看到錯誤,指出屬性必須是 的 ExtendedMembershipProvider 實例,則網站可能未設定為使用 ASP.NET Web Pages 成員資格系統, (SimpleMembership) 。 如果主控提供者的伺服器設定方式與您的本機伺服器不同,有時就會發生此情況。 若要修正此問題,請將下列元素新增至網站的 Web.config 檔案:

    <appSettings>
        <add key="enableSimpleMembership" value="true" />
    </appSettings>
    

    將這個專案新增為專案的子 <configuration> 專案,以及作為專案的 <system.web> 對等專案。

  9. 在頁面右上角,按一下 [ 註冊] 連結。 [ Register.cshtml ] 頁面隨即顯示。

  10. 輸入使用者名稱和密碼,然後按一下 [ 註冊]。

    security-membership-3

    當您從入門網站範本建立網站時,會在網站的[App_Data] 資料夾中建立名為StarterSite.sdf的資料庫。 在註冊期間,您的使用者資訊會新增至資料庫。 如果您設定 SMTP 值,則會將訊息傳送至您所使用的電子郵件地址,以便完成註冊。

    security-membership-4

  11. 移至您的電子郵件程式並尋找訊息,其中包含您的確認碼和網站的超連結。

  12. 按一下超連結以啟動您的帳戶。 確認超連結會開啟註冊確認頁面。

    security-membership-5

  13. 按一下 [ 登入 ] 連結,然後使用您註冊的帳戶登入。

    登入之後, [登入 ] 和 [ 註冊] 連結會取代為 登出 連結。 您的登入名稱會顯示為連結。 (連結可讓您移至可變更 password.) 的頁面

    security-membership-6

    注意

    根據預設,ASP.NET 網頁會將認證以純文字傳送至伺服器, (為人類可讀的文字) 。 生產網站應該使用安全 HTTP (HTTPs://,也稱為 安全通訊端層 或 SSL) 來加密與伺服器交換的敏感性資訊。 您可以依照上一個範例中的設定, WebMail.EnableSsl=true 要求使用 SSL 傳送電子郵件訊息。 如需 SSL 的詳細資訊,請參閱 保護 Web 通訊:憑證、SSL 和 HTTPs://

網站中的其他成員資格功能

您的網站包含其他功能,可讓使用者管理其帳戶。 使用者可以執行下列動作:

  • 變更其密碼。 登入之後,他們可以按一下使用者名稱, (這是連結) 。 這會將他們帶至頁面,以便建立新的密碼 (Account/ChangePassword.cshtml) 。
  • 復原忘記的密碼。 在登入頁面上,有一個連結 (您是否忘記密碼?) 會將使用者帶至帳戶 /ForgetPassword.cshtml (頁面,) 他們可以在其中輸入電子郵件地址。 網站會傳送電子郵件訊息,其中包含可按一下的連結,以設定新的密碼 (Account/PasswordReset.cshtml) 。

您也可以讓使用者也可以使用外部網站登入,如稍後所述。

建立Members-Only頁面

目前,任何人都可以流覽至網站中的任何頁面。 但您可能想要讓只有登入 (的使用者才能使用頁面,也就是成員) 。 ASP.NET 可讓您建立只能由登入成員存取的頁面。 一般而言,如果匿名使用者嘗試存取僅限成員的頁面,您可以將他們重新導向至登入頁面。

在此程式中,您將建立一個資料夾,其中包含僅供登入的使用者使用的頁面。

  1. 在月臺的根目錄中,建立新的資料夾。 (在功能區中,按一下 [ 新增 ] 下方的箭號,然後選擇 [ 新增資料夾]。)

  2. 將新資料夾命名為 Members

  3. Members 資料夾內,建立新的頁面,並將其命名為 MembersInformation.cshtml

  4. 以下列程式碼和標記取代現有的內容:

    @{
        if (!WebSecurity.IsAuthenticated) {
            Response.Redirect("~/Account/Login?returnUrl="
                + Request.Url.LocalPath);
        }
        Layout = "~/_SiteLayout.cshtml";
        Page.Title = "Members Information";
    }
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8" />
        <title>Members Information</title>
      </head>
      <body>
        <p>You can only see this information if you've logged into the site.</p>
      </body>
    </html>
    

    此程式碼會 IsAuthenticated 測試 物件的 屬性 WebSecurity ,如果使用者已登入,則會傳 true 回 。 如果使用者未登入,程式碼會呼叫 Response.Redirect ,以將使用者傳送至Account資料夾中的Login.cshtml頁面。

    重新導向的 URL 包含用來 returnUrl 設定目前頁面路徑的查詢字串值 Request.Url.LocalPath 。 如果您在類似此 (的查詢字串中設定 returnUrl 值,而且如果傳回 URL 是本機路徑) ,登入頁面會在登入後將使用者傳回此頁面。

    程式碼也會 將 _SiteLayout.cshtml 頁面設定為其版面配置頁面。 (如需版面配置頁面的詳細資訊,請參閱在 ASP.NET Web Pages Sites 中建立一致的版面配置。)

  5. 執行月臺。 如果您仍然登入,請按一下頁面頂端的 [登出 ] 按鈕。

  6. 在瀏覽器中,要求 頁面 /Members/MembersInformation。 例如,URL 看起來可能像這樣:

    http://localhost:38366/Members/MembersInformation

    (URL 中的埠號碼 (38366) 可能不同。)

    系統會將您重新導向至 Login.cshtml 頁面,因為您未登入。

  7. 使用您稍早建立的帳戶登入。 系統會將您重新導向回 MembersInformation 頁面。 因為您已登入,所以這次您會看到頁面內容。

若要保護對多個頁面的存取,您可以執行此動作:

  • 將安全性檢查新增至每個頁面。
  • 在您保留受保護頁面的資料夾中建立 _PageStart.cshtml 頁面,並在該處新增安全性檢查。 _PageStart.cshtml頁面可作為資料夾中所有頁面的一種全域頁面。 在自訂 ASP.NET Web PagesSite-Wide行為中會更詳細地說明這項技術。

為使用者群組建立安全性群組 (角色)

如果您的網站有許多成員,在讓使用者看到頁面之前,個別檢查每個使用者的許可權並不有效率。 您可以改為建立個別成員所屬的群組或 角色。 然後,您可以根據角色檢查許可權。 在本節中,您將建立「系統管理員」角色,然後建立可供屬於該角色 () 使用者存取的頁面。

ASP.NET 成員資格系統已設定為支援角色。 不過,不同于成員資格註冊和登入, 入門網站 範本不包含可協助您管理角色的頁面。 (管理角色是系統管理工作,而不是使用者 task.) 不過,您可以直接在 WebMatrix 的成員資格資料庫中新增群組。

  1. 在 WebMatrix 中,按一下 [ 資料庫 ] 工作區選取器。

  2. 在左窗格中,開啟 StarterSite.sdf 節點,開啟 [ 資料表 ] 節點,然後按兩下 webpages_Roles 資料表。

    security-membership-7

  3. 新增名為 「admin」 的角色。 [RoleId] 欄位會自動填入。 (它是主鍵,且已設定為識別欄位,如在ASP.NET Web Pages Sites 中使用資料庫簡介中所述。)

  4. 記下 RoleId 欄位的值。 (如果這是您要定義的第一個角色,它將會是 1.)

    security-membership-8

  5. 關閉 webpages_Roles 資料表。

  6. 開啟 UserProfile 資料表。

  7. 記下資料表中一或多個使用者的 UserId 值,然後關閉資料表。

  8. 開啟 webpages_UserInRoles資料表, 然後在資料表中輸入 UserIDRoleID 值。 例如,若要將使用者 2 放入「系統管理員」角色,您會輸入下列值:

    security-membership-9

  9. 關閉 webpages_UsersInRoles 資料表。

    現在您已定義角色,您可以設定可供該角色的使用者存取的頁面。

  10. 在網站根資料夾中,建立名為 AdminError.cshtml 的新頁面,並以下列程式碼取代現有的內容。 如果使用者不允許存取頁面,則會將此頁面重新導向至該頁面。

    @{
        Layout = "~/_SiteLayout.cshtml";
        PageData["Title"] = "Admin-only Error";
    }
    <p>You must log in as an admin to access that page.</p>
    
  11. 在網站根資料夾中,建立名為 AdminOnly.cshtml 的新頁面,並以下列程式碼取代現有的程式碼:

    @{
        Layout = "~/_SiteLayout.cshtml";
        PageData["Title"] = "Administrators only";
    }
    
    @if ( Roles.IsUserInRole("admin")) {
        <span> Welcome <b>@WebSecurity.CurrentUserName</b>! </span>
    }
    else {
         Response.Redirect("~/AdminError");
    }
    

    Roles.IsUserInRole如果目前使用者是指定角色的成員,則此方法會傳回 true (在此案例中為 「admin」 角色) 。

  12. 在瀏覽器中執行 Default.cshtml ,但不要登入。 (如果您已經登入,請登出。)

  13. 在瀏覽器的網址列中,于 URL 中新增 AdminOnly 。 (換句話說,要求 AdminOnly.cshtml file.) 您會被重新導向至 AdminError.cshtml 頁面,因為您目前未以使用者身分登入「admin」 角色。

  14. 返回 Default.cshtml ,並以您新增至 「admin」 角色的使用者身分登入。

  15. 流覽至 AdminOnly.cshtml 頁面。 這次您會看到頁面。

防止自動化程式加入您的網站

登入頁面不會停止自動化程式, (有時稱為Web 機器人或 Bot) ,無法向您的網站註冊。 此程式描述如何啟用註冊頁面的 ReCaptcha 測試。

/media/38777/ch16securitymembership-18.jpg

  1. ReCaptcha 服務註冊您的網站。 完成註冊之後,您會收到公開金鑰和私密金鑰。

  2. 如尚未在ASP.NET Web Pages網站中安裝協助程式中所述,將 ASP.NET Web 協助程式程式庫新增至您的網站。

  3. [帳戶] 資料夾中,開啟名為 Register.cshtml 的檔案。

  4. 在頁面頂端的程式碼中,尋找下列幾行,並移除 // 批註字元來取消批註:

    if (!ReCaptcha.Validate("PRIVATE_KEY")) {
        ModelState.AddError("recaptcha", "Captcha response was not correct");
    }
    
  5. 以您自己的 ReCaptcha 私密金鑰取代 PRIVATE_KEY

  6. 在頁面的標記中,從頁面標記中的下列幾行移除 @**@ 批註字元:

    @ReCaptcha.GetHtml("PUBLIC_KEY", theme: "white")
    @Html.ValidationMessage("recaptcha")
    
  7. 以您的金鑰取代 PUBLIC_KEY

  8. 如果您尚未移除它,請移除 <div> 包含開頭為 「To enable CAPTCHA verification ...」之文字的專案。 (移除整個 <div> 元素及其 contents.)

  9. 在瀏覽器中執行 Default.cshtml 。 如果您已登入網站,請按一下 [ 登出 ] 連結。

  10. 按一下 [ 註冊] 連結,然後使用 CAPTCHA 測試來測試註冊。

    security-membership-10

如需協助程式的詳細資訊 ReCaptcha ,請參閱 使用 CATPCHA 防止自動化程式 (Bot) 使用您的 ASP.NET 網站

讓使用者使用外部網站登入

入門網站範本包含程式碼和標記,可讓使用者使用 Facebook、Windows Live、Twitter、Google 或 Yahoo 登入。 根據預設,此功能不會啟用。 讓使用者使用這些外部提供者登入的一般程式如下:

  • 決定您想要支援哪些外部網站。
  • 如有需要,請移至該網站並設定登入應用程式。 (例如,您必須執行此動作,才能允許 Facebook logins.)
  • 在您的網站中,設定提供者。 在大部分情況下,您只需要取消批註 _AppStart.cshtml 檔案中的某些程式碼。
  • 將標記新增至註冊頁面,讓使用者連結至外部網站以進行登入。 您通常可以複製所需的標記,並稍微變更文字。

您可以在ASP.NET Web Pages網站中從外部網站啟用登入主題中找到逐步指示。

當使用者從另一個網站登入之後,使用者會返回您的網站,並將該登入與您的網站 產生關聯 。 實際上,這會為使用者的外部登入在您的網站中建立成員資格專案。 這可讓您使用成員資格 (的一般功能,例如與外部登入) 的角色。

將安全性新增至現有網站

本文稍早的程式依賴使用 入門網站 範本作為網站安全性的基礎。 如果您從 入門網站 範本開始並不實用,或根據該範本從網站複製相關頁面,您可以自行撰寫程式碼,在自己的網站中實作相同類型的安全性。 您可以建立相同類型的頁面 —註冊、登入等等,然後使用協助程式和類別來設定成員資格。

基本程式會在部落格文章中說明實作 ASP.NET Razor 安全性的最基本方式。 大部分的工作都是使用協助程式的下列方法和屬性 WebSecurity 來完成:

若要管理角色,您可以使用 角色成員資格 類別,如部落格文章中所述。

其他資源