ASP.NET 用戶和角色管理 附加代碼詳解

1. 身份驗證和授權

1.1. 身份驗證

在.NET中提供了身份驗證和授權來保證程序的安全,提供forms身份驗證和登錄系列控件相結合的方式可以提供更加完善的用戶管理功能,可以較好的提供授權管理範圍。身份驗證指的是根據用戶的驗證消息來識別他的身份。

在.NET中身份驗證主要有三種方式,分別是Forms、Windows和Passport。
其中Forms指的是在開發者所在的服務器上來實現,其驗證流程如圖所示:
在這裏插入圖片描述
Forms主要有三種方式來驗證用戶資料:

  1. 在代碼中直接驗證。即要驗證的信息寫死在代碼中,無法再更改。
  2. 利用數據庫實現驗證。即把信息存儲到數據庫中,要驗證時通過查詢數據庫進行匹配驗證。
  3. 利用配置文件直接驗證。使用FormsAuthentication類對ASP.NET的配置文件進行配置

對於FormsAuthentication類而言,它有以下一些常用屬性和方法:

名稱 說明
Authenticate 對照存儲在應用程序配置文件中的憑據來驗證用戶名和密碼
GetAuthCookie 爲給定的用戶名創建身份驗證Cookie
GetRedirectUrl 返回重定向到登錄頁的原始請求的URL
HashPasswordForStoringInConfigFile 根據指定的密碼和哈希算法生成一個適合於存儲在配置文件中的哈希密碼
RedirectFromLoginPage 將經過身份驗證的用戶重定向回最初請求的URL或默認URL
SetAuthCookie 爲提供的用戶名創建一個身份驗證票證,並將其添加到響應的Cookie集合或URL
SignOut 從瀏覽器刪除Forms身份驗證票證

1.2. 授權

授權指的是確定提供驗證的用戶可以訪問哪些資源。ASP.NET中提供了兩種授權方式,分別是:

  1. 文件授權,指的是驗證遠程用戶是否有權限訪問所請求的文件,主要通過檢查.aspx或者.asmx的訪問控制列表來確定是否具有權限,通常使用FileAuthorizationModule類來實現;
  2. URL授權,指的是驗證遠程用戶是否有權限訪問所請求的url,主要通過將用戶和角色映射到ASP.NET應用程序的url中,通常使用UrlIAuthorizationModule類來實現

要使用URL授權需要在web.configure中配置<authorization>節,在其中指定用於授予訪問權限的<allow>和用於撤銷訪問權限的<deny>標籤,例如:

<authorization>
	<!--users 用於標識目標身份; roles用於標識請求角色;verbs用來定義http方法-->
	<allow users= "逗號分割的用戶列表"
		   roles= "逗號分割的角色列表"
		   verbs= "逗號分割的HTTP請求列表" />
	<deny users= "逗號分割的用戶列表"
		  roles="逗號分割的角色列表"
		  verbs= "逗號分割的HTTP請求列表" />
</authorization>

2. 登錄控件

2.1. CreateUserWizard控件

CreateUserWizard控件提供用於創建新網站用戶帳戶的用戶界面。該對象與網站的用戶數據存儲區進行通信,以便在數據存儲區中創建新用戶帳戶。默認情況下,CreateUserWizard 控件將接受網站訪問者的用戶名和密碼。

在選定了CreateUserWizard控件之後,會自動創建一個登陸界面(這裏用代碼代替圖形化操作)

// WebForm1.aspx
<body>
    <form id="form1" runat="server">
        <div>
            <asp:CreateUserWizard ID="CreateUserWizard1" runat="server">
                <WizardSteps>
                    <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
                    </asp:CreateUserWizardStep>
                    <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
                    </asp:CompleteWizardStep>
                </WizardSteps>
            </asp:CreateUserWizard>
        </div>
    </form>
</body>

自動生成如下界面
在這裏插入圖片描述

之後需要創建成員資格用戶,用命令執行。打開“VS IDE的開發人員命令提示”(Developer Command Prompt for VS XXX),輸入:

aspnet_regsql.exe

回車之後,出現如下安裝嚮導對話框
在這裏插入圖片描述
一直下一步到以下界面,按照說明配置好之後下一步,完成
在這裏插入圖片描述
這時就創建好了一個成員資格數據庫,連接SQL Server看看
在這裏插入圖片描述
嗯,數據庫創建好了,這時切換回ASP.NET項目,打開Web.config,在其中加入connectionStrings配置節來配置數據庫連接字符串,其中Server是服務器名,Database是數據庫名,User Id是數據庫登錄賬戶,pwd是數據庫登錄密碼

<configuration>
  <connectionStrings>
    <remove name="LocalServer"/>
    <add name="LocalServer" connectionString="Server=DEITIVOD\SQLEXPRESS; Database=aspnetdb; User Id=sa; pwd=admin"/>
  </connectionStrings>
</configuration>

配置好後運行程序,測試結果如下圖所示,需要注意的是,設置的密碼必須包括字母、數字以及特殊字符且長度至少爲7個字符,否則報錯,例如123@qaz,tian_0ok
在這裏插入圖片描述
常見錯誤一,在沒有配置jQuery的情況下會報WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping。請添加一個名爲 jquery (區分大小寫)的 ScriptResourceMapping錯誤,因爲Unobtrusive ValidationMode是.NET的一種隱式的驗證方式,需要前端調用jquery來進行身份驗證,且默認啓用。

這時可以通過下面方法解決報錯(所用的jQuery版本是截止2020年5月的最新版本):

  1. 官網下載jquery-3.5.1.jsjquery-3.5.1.min.js兩個文件
  2. 在ASP項目的根目錄下新建一個scripts文件夾,把jquery-3.5.1.jsjquery-3.5.1.min.js放進去
  3. 在根目錄下添加全局應用程序類Global.asax文件,在Application_Start事件中添加如下代碼:
protected void Application_Start(object sender, EventArgs e)
{
    ScriptManager.ScriptResourceMapping.AddDefinition("jquery", new ScriptResourceDefinition
    {
        Path = "~/scripts/jquery-3.5.1.min.js",
        DebugPath = "~/scripts/jquery-3.5.1.js",
        CdnPath = "https://code.jquery.com/jquery-3.5.1.min.js",
        CdnDebugPath = "https://code.jquery.com/jquery-3.5.1.js"
    });
}

常見錯誤二,SQLExpress 數據庫文件自動創建錯誤:

在與 SQL Server 建立連接時出現與網絡相關的或特定於實例的錯誤。未找到或無法訪問服務器。請驗證實例名稱是否正確並且 SQL Server 已配置爲允許遠程連接。 (provider: SQL Network Interfaces, error: 26 - 定位指定的服務器/實例時出錯)
說明: 執行當前 Web 請求期間,出現未經處理的異常。請檢查堆棧跟蹤信息,以瞭解有關該錯誤以及代碼中導致錯誤的出處的詳細信息。

SQLExpress 數據庫文件自動創建錯誤:

連接字符串使用應用程序 App_Data 目錄中的數據庫位置指定了一個本地 SQL Server Express 實例。由於提供程序確定應用程序服務數據庫不存在,因此嘗試自動創建該數據庫。要成功檢查應用程序服務數據庫是否存在並自動創建應用程序服務數據庫,必須滿足下列配置要求:

1、如果應用程序在 Windows 7 或 Windows Server 2008 R2 上運行,則需要執行特殊配置步驟才能自動創建提供程序數據庫。在以下地址提供了更多信息: http://go.microsoft.com/fwlink/?LinkId=160102。如果應用程序的 App_Data 目錄尚不存在,則 Web 服務器帳戶必須具有對應用程序目錄的讀寫訪問權限。這是必要的權限,因爲如果不存在 App_Data 目錄,Web 服務器帳戶將自動創建它。
2、如果應用程序的 App_Data 目錄已存在,則 Web 服務器帳戶只要求對應用程序的 App_Data 目錄具有讀寫訪問權限。這是必要的權限,因爲 Web 服務器帳戶將嘗試驗證應用程序的 App_Data 目錄中是否已存在 SQL Server Express 數據庫。如果撤消 Web 服務器帳戶對 App_Data 目錄的讀訪問權限,提供程序便無法正確地確定 SQL Server Express 數據庫是否已存在。如果提供程序嘗試創建已存在的數據庫的副本,則會出錯。寫訪問權限也是必需的,因爲創建新數據庫時需要使用 Web 服務器帳戶憑據。
3、計算機上必須安裝 SQL Server Express。
4、Web 服務器帳戶的進程標識必須具有本地用戶配置文件。有關如何爲計算機帳戶和域帳戶創建本地用戶配置文件的詳細信息,請參見自述文檔。

這是因爲CreateUserWizard控件默認連接SQL Express數據庫,此時需要下載安裝SQL Express數據庫並重復以上建立數據庫及以後的步驟。

如果想以SQL Server 數據庫繼續執行程序,可以參考博客WebPart應用程序中服務器錯誤的解決辦法,對連接字符串進行配置

2.2. Login控件

Login控件是一個複合控件,它有效集成了登錄驗證頁面中常見的用戶界面元素和功能,該控件是與CreateUserWizard控件相互聯動的,必須要先註冊用戶才能登錄

例如下面的代碼,構造了一個Login控件,在登錄成功時跳轉到頁面WebForm2.aspx

// .aspx文件
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Login ID="Login1" runat="server" DestinationPageUrl="~/WebForm2.aspx"></asp:Login>
        </div>
    </form>
</body>

在這裏插入圖片描述

2.3. LoginName控件

LoginName控件顯示用戶的登錄名,如果應用程序使用Windows身份驗證,該控件則顯示用戶的域名和賬戶名:如果應用程序使用Forms身份驗證,則顯示數據庫中Membership的賬號,通常使用Forms身份驗證。

例如在已經放置了Login控件的基礎上,放置一個LoginName控件:

// WebForm2.aspx文件
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Login ID="Login1" runat="server" DestinationPageUrl="~/WebForm3.aspx"></asp:Login>
        </div>
    </form>
</body>

// WebForm3.aspx文件
<body>
    <form id="form1" runat="server">
        <div>
            <asp:LoginName ID="LoginName1" runat="server" FormatString="歡迎您:{0}" />
        </div>
    </form>
</body>

在這裏插入圖片描述
如果出現LoginName中用戶名不顯示或者顯示的是計算機的名字,而不是網站用戶的名字,則需要在Web.config中的 <system.web> 配置節中配置 < authentication> 節,如下:

<system.web>
  <!-- 其他配置節 -->
  <authentication mode="Forms">
  	<!-- loginUrl中填寫Login控件在的頁面 -->
    <forms loginUrl="~/WebForm2.aspx" timeout="2880" />
  </authentication>
</system.web>

2.4. LoginStatus控件

LoginStatus控件用來描述用戶的登錄狀態,它可以表示兩種狀態"已登錄網站"和"已從網站註銷",對於上述任何一種或兩種狀態,都可以爲其顯示文本或圖像。

例如下面的代碼:

// WebForm4.aspx
<body>
    <form id="form1" runat="server">
        <div>
            <asp:LoginName ID="LoginName1" runat="server" FormatString="{0}" />
            <asp:LoginStatus ID="LoginStatus1" runat="server" />
        </div>
    </form>
</body>

// WebForm2.aspx
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Login ID="Login1" runat="server" DestinationPageUrl="~/WebForm4.aspx"></asp:Login>
        </div>
    </form>
</body>

在這裏插入圖片描述

2.5. LoginView控件

LoginView控件根據用戶是否經過身份驗證以及屬於哪個網站角色(如果用戶經過身份驗證),爲不同的用戶顯示不同的網站內容模板或視圖。

例如下面的代碼,就是用LoginView控件包含了LoginName控件和LoginStatus控件對登錄信息進行展示

// WebForm2.aspx
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Login ID="Login1" runat="server" DestinationPageUrl="~/WebForm4.aspx"></asp:Login>
        </div>
    </form>
</body>

// WebForm4.aspx
<body>
    <form id="form1" runat="server">
        <div>
            <asp:LoginView ID="LoginView1" runat="server">
                <AnonymousTemplate>
                    <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/WebForm2.aspx">請您登錄本網站</asp:HyperLink>
                </AnonymousTemplate>
                <LoggedInTemplate>
                    <asp:LoginName ID="LoginName1" runat="server" FormatString="歡迎您:{0}" />
                    <br />
                    <asp:LoginStatus ID="LoginStatus1" runat="server" />
                </LoggedInTemplate>
            </asp:LoginView>
        </div>
    </form>
</body>

在這裏插入圖片描述

2.6. ChangePassword控件

ChangePassword控件可實現快速修改密碼。

如下代碼使用了ChangePassword控件修改已登錄用戶的密碼:

// WebForm2.aspx
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Login ID="Login1" runat="server" DestinationPageUrl="~/WebForm5.aspx"></asp:Login>
        </div>
    </form>
</body>

// WebForm5.aspx
<body>
    <form id="form1" runat="server">
        <div>
            <asp:ChangePassword ID="ChangePassword1" runat="server"></asp:ChangePassword>
        </div>
    </form>
</body>

在這裏插入圖片描述
也可以選擇指定ChangePassword控件的SuccessPageUrl爲登錄頁面,這樣在成功修改密碼後就會自動跳轉的登錄界面要求用戶重新登錄,例如在本例中,可以將WebForm5.aspx修改爲

<body>
    <form id="form1" runat="server">
        <div>
            <asp:ChangePassword ID="ChangePassword1" runat="server" SuccessPageUrl="~/WebForm2.aspx"></asp:ChangePassword>
        </div>
    </form>
</body>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章