使用membership(System.Web.Security)來進行角色與權限管理

1.membership簡介
2.membership在sql server中的設置
3.配置web.config
4.創建用戶CreateUserWizard控件
5.用戶登錄login控件
6.顯示當前用戶的名稱LoginName控件
7.檢測用戶的身份驗證狀態的LoginStatus控件
8.爲不同類別用戶呈現不同內容的LoginView控件
9.更改密碼的ChangePassword控件
10.自助找回密碼的PasswordRecovery控件
11.總結

1.membership簡介

membership,真的很有趣,很方便,很有用。介紹給大家。
在 ASP.NET 應用程序中,Membership 類用於驗證用戶憑據並管理用戶設置(如密碼和電子郵件地址)。Membership 類可以獨自使用,或者與 FormsAuthentication 一起使用以創建一個完整的 Web 應用程序或網站的用戶身份驗證系統。Login 控件封裝了 Membership 類,從而提供一種便捷的用戶驗證機制。
Membership 類提供的功能可用於:
1)創建新用戶。
2)將成員資格信息(用戶名、密碼、電子郵件地址及支持數據)存儲在 Microsoft SQL Server 或其他類似的數據存儲區。
3)對訪問網站的用戶進行身份驗證。可以以編程方式對用戶進行身份驗證,也可以使用 Login 控件創建一個只需很少代碼或無需代碼的完整的身份驗證系統。
4)管理密碼。包括創建、更改、檢索和重置密碼等等。可以選擇配置 ASP.NET 成員資格以要求一個密碼提示問題及其答案來對忘記密碼的用戶的密碼重置和檢索請求進行身份驗證。
默認情況下,ASP.NET 成員資格可支持所有 ASP.NET 應用程序。默認成員資格提供程序爲 SqlMembershipProvider 並在計算機配置中以名稱 AspNetSqlProvider 指定。SqlMembershipProvider 的默認實例配置爲連接到 Microsoft SQL Server 的一個本地實例。

2.membership在sql server中的設置

要使用membership,需要對數據庫進行一些設置,使用過membership的朋友知道,數據庫中有一些固有的表、視圖和存儲過程,我們自己的表中沒有這些東西。
不過,我們可以通過嚮導來創建它們,那就是aspnet_regsql.exe,一般來說它位於:C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727(我的就在這裏)
它既可以創建數據庫中的選項,也可以移除這些設置。
在運行這個程序之前,我在sql server2005中建立了一個空的數據庫:membershipdemo。
建立membershipdemo後,我們運行aspnet_regsql.exe,指定membership爲membershipdemo。
[attach]34768[/attach]
完成之後,空空的數據庫就有很多內容了,不過具體的內容暫時不必管。繼續後面的內容。
[attach]34769[/attach]

3.配置web.config

web.config也是要修改的。
在system.web節點下添加authentication節點
membership既然是用於成員資格管理,當然要求登錄驗證身份,所以首先加上一個forms驗證。

CODE:
    <authentication mode="Forms">
      <forms loginUrl="login.aspx" name=".aspxlogin"/>
    </authentication>

同樣在system.web節點下添加membership節點

CODE:
        <membership defaultProvider="AspNetSqlMembershipProvider" userIsOnlineTimeWindow="15" hashAlgorithmType="">
            <providers>
                <clear/>
                <add connectionStringName="ConnectionString" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression="" name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
            </providers>
        </membership>

屬性解釋說明:
defaultProvider:提供程序的名稱。默認爲 AspNetSqlMembershipProvider。如果你有多個Provider的話,指定一個默認值是明智的做法
userIsOnlineTimeWindow:指定用戶在最近一次活動的日期/時間戳之後被視爲聯機的分鐘數。
hashAlgorithmType:用於哈希密碼的算法的標識符,或爲空以使用默認哈希算法。
connectionStringName:membership數據庫的連接名稱。
enablePasswordRetrieval:指示當前成員資格提供程序是否配置爲允許用戶檢索其密碼。
enablePasswordReset:指示當前成員資格提供程序是否配置爲允許用戶重置其密碼。
requiresQuestionAndAnswer:指示默認成員資格提供程序是否要求用戶在進行密碼重置和檢索時回答密碼提示問題。
applicationName:應用程序的名稱。
requiresUniqueEmail:指示成員資格提供程序是否配置爲要求每個用戶名具有唯一的電子郵件地址。
passwordFormat:指示在成員資格數據存儲區中存儲密碼的格式。值可選Clear、Encrypted 和 Hashed。Clear 密碼以明文形式存儲,這可以提高存儲和檢索密碼的性能,但安全性較差,當數據源安全性受到威脅時此類密碼很容易被讀取。Encrypted 密碼在存儲時進行了加密,可以在比較或檢索密碼時進行解密。此類密碼在存儲和檢索時需要進行額外的處理,但比較安全,在數據源的安全性受到威脅時不容易被獲取。Hashed 密碼在存儲到數據庫時使用單向哈希算法和隨機生成的 salt 值進行哈希處理。在驗證某一密碼時,將用數據庫中的 salt 值對該密碼進行哈希計算以進行驗證。無法檢索哈希密碼。
maxInvalidPasswordAttempts:鎖定成員資格用戶前允許的無效密碼或無效密碼提示問題答案嘗試次數。
minRequiredPasswordLength:密碼所要求的最小長度。
minRequiredNonalphanumericCharacters:有效密碼中必須包含的最少特殊字符數。
passwordAttemptWindow:在鎖定成員資格用戶之前允許的最大無效密碼或無效密碼提示問題答案嘗試次數的分鐘數。這是爲了 防止不明來源反覆嘗試來猜測成員資格用戶的密碼或密碼提示問題答案的額外措施。
passwordStrengthRegularExpression:計算密碼的正則表達式。

爲membership配置web.config後,再配置其角色管理roleManager
也是在system.web下

CODE:
        <roleManager enabled="true" cacheRolesInCookie="true">
            <providers>
                <clear/>
                <add connectionStringName="ConnectionString" applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
            </providers>
        </roleManager>

屬性解釋說明:
cacheRolesInCookie:指示當前用戶的角色是否已緩存在某個 Cookie 中。
當 CacheRolesInCookie 屬性在配置文件中設置爲 true 時,每個用戶的角色信息就會存儲在客戶端上的某個 Cookie 中。當角色管理檢查確定某個用戶是否屬於某個特定角色時,在調用角色提供程序在數據源中檢查角色列表之前,將先檢查角色 Cookie。該 Cookie 在客戶端上會動態更新以緩存最近已驗證的角色名稱。
web.config就配置差不多了。
真正步入正題。

4.創建用戶CreateUserWizard控件

在vs2005中創建一個aspx頁面,取名CreateUserWizard.aspx。
直接從toolbox中拖入一個CreateUserWizard控件,設置一下FinishDestinationPageUrl屬性,該屬性指示用戶創建完成後,用戶點擊“繼續”後定向的頁面。

CODE:
         <asp:CreateUserWizard ID="CreateUserWizard1" runat="server" ContinueDestinationPageUrl="~/Default.aspx">
        </asp:CreateUserWizard>


現在不做任何設置,在vs2005的中design視圖中可以看到

測試一下先!

提交,出現下面結果:
[attach]34772[/attach]
所以,正確設置membership後,註冊用戶就立馬可以使用了。
這CreateUserWizard的默認模板
你也可以自己創建你需要的模板
vs2005可以幫你轉換出來
你可以修改一下,轉換後就是這樣
代碼會很多
 

5.用戶登錄login控件

CreateUserWizard可以直接拖出來用,login控件也是一樣。
在頁面中放入一個login,代碼很簡單

CODE:
        <asp:Login ID="Login1" runat="server" DestinationPageUrl="~/admin/Default.aspx" PasswordRecoveryText="找回密碼" PasswordRecoveryUrl="PasswordRecovery.aspx">
        </asp:Login>

屬性解釋:
DestinationPageUrl:設置在登錄嘗試成功時向用戶顯示的頁面的 URL。
PasswordRecoveryText:設置密碼恢復頁鏈接的文本。
PasswordRecoveryUrl:設置密碼恢復頁的 URL。 如果用戶忘記密碼,可以點擊這個鏈接點找回他的密碼。
同樣,你也可以自寫模板。

這次先不忙測試。
等一下後面的控件!

6.顯示當前用戶的名稱LoginName控件

這個控件很簡單,就是用來呈現用戶名的。

CODE:
<asp:LoginName ID="LoginName1" runat="server" FormatString="您好,{0},您目前的身份是:註冊用戶" />

如果當前登錄的是blueidea,那麼顯示的就是“您好,blueidea,您目前的身份是:註冊用戶”。

7.檢測用戶的身份驗證狀態的LoginStatus控件

可以說是最簡單的控件了。

CODE:
<asp:LoginStatus ID="LoginStatus1" runat="server" />

它包含兩種狀態:
1)已登錄到網站。
2)已從網站註銷。
當用戶註銷後,會給出一個“登錄”的鏈接,用戶可以點擊這個鏈接來登錄;當用戶登錄後,這個控件會自動轉變爲“註銷”狀態。

8.爲不同類別用戶呈現不同內容的LoginView控件

全部登錄控件都可以直接拿來用,不過,這一個我們來做更多一些東西。

CODE:
            <asp:LoginView ID="LoginView1" runat="server">
                <LoggedInTemplate>
                    <asp:LoginName ID="LoginName1" runat="server" FormatString="您好,{0},您已經登錄了。" />
                </LoggedInTemplate>
                <AnonymousTemplate>
                    <asp:Label ID="Label2" runat="server" Text="您尚未登錄,請"></asp:Label><asp:LoginStatus
                        ID="LoginStatus1" runat="server" />
                </AnonymousTemplate>
                <RoleGroups>
                    <asp:RoleGroup Roles="admin">
                        <ContentTemplate>
                            <asp:LoginName ID="LoginName1" runat="server" FormatString="您好,{0},您目前的身份是:管理員" />
                            <br />
                            您可以訪問:<asp:HyperLink ID="HyperLink1" NavigateUrl="User/Default.aspx" runat="server">User/Default.aspx</asp:HyperLink>
                            <br />
                            您也可以訪問:<asp:HyperLink ID="HyperLink2" NavigateUrl="Admin/Default.aspx" runat="server">Admin/Default.aspx</asp:HyperLink>
                            <br />
                            <asp:LoginStatus ID="LoginStatus3" runat="server" />
                        </ContentTemplate>
                    </asp:RoleGroup>
                    <asp:RoleGroup Roles="member">
                        <ContentTemplate>
                            <asp:LoginName ID="LoginName1" runat="server" FormatString="您好,{0},您目前的身份是:註冊用戶" />
                            <br />
                            您可以訪問<asp:HyperLink ID="HyperLink1" NavigateUrl="User/Default.aspx" runat="server">User/Default.aspx</asp:HyperLink>
                            <br />
                            您不能訪問<asp:HyperLink ID="HyperLink2" NavigateUrl="Admin/Default.aspx" runat="server">Admin/Default.aspx</asp:HyperLink>
                            <br />
                            <asp:LoginStatus ID="LoginStatus2" runat="server" />
                        </ContentTemplate>
                    </asp:RoleGroup>
                </RoleGroups>
            </asp:LoginView>

可以看到,這裏包含了三個模板:LoggedInTemplate、AnonymousTemplate和RoleGroup的模板。
如果定義了LoggedInTemplate模板,那麼該用戶會看到該模板內的內容,除非該用戶屬於另一個角色組,且該角色組在已在RoleGroups的模板中的定義。
當匿名用戶訪問站點時,AnonymousTemplate內的內容會呈現給該用戶。
在前面我們配置的web.config中啓用了角色,我們現在爲admin角色定義一個模板,你可以在上面的代碼中找到。
到現在,我們就可以測試一下效果了。

可以看到,我們還沒有登錄,AnonymousTemplate的內容呈現在我們的面前。而且其中的LoginStatus顯示的狀態是“登錄”狀態。
我們登錄一下,前面註冊了一個用戶,登錄一下。

LoggedInTemplate沒有起作用,而是member的角色模板起作用,這是因爲,其實我們在CreateUserWizard做了設置,新用戶註冊以後直接納入member角色組了。
在CreateUserWizard的CreatedUser事件中添加一句簡單的話:

CODE:
    protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
    {
        Roles.AddUserToRole(CreateUserWizard1.UserName, "member");
    }

再來解釋一下上面的的“你可以訪問……”是什麼意思。
在此之前我其實已經添加了兩個角色:member和admin。
角色添加方法很簡單:
在vs2005中選擇 網站->ASP.NET配置->安全->創建或管理角色
跟上面的的配合,我們添加一個角色叫“admin”。

再選擇“創建訪問規則”來創建訪問規則。
給admin文件創建下面規則,如圖示:

拒絕member組和匿名用戶,只允許admin組的用戶訪問admin文件夾。
給user文件夾創建如下訪問規則。

拒絕匿名用戶,允許member組和admin組的用戶。

當新註冊用戶登錄後,它們可以訪問到user文件夾下的文件

但是,如果訪問admin文件夾時則會被定向到登錄頁。


9.更改密碼的ChangePassword控件

如果更改密碼,就使用它來修改。

CODE:
        <asp:ChangePassword ID="ChangePassword1" runat="server">
        </asp:ChangePassword>

不需要設置,就可以修改密碼了。
[attach]34780[/attach]

10.自助找回密碼的PasswordRecovery控件

忘了密碼怎麼辦,可以自已找回啦!
不過,在些之前,web.config得另有配置。
在system.web中的同級節點創建system.net節點,具體內容如下:

CODE:
  <system.net>
    <mailSettings>
      <smtp deliveryMethod="Network"   from="*@126.com">
        <network defaultCredentials="false" host="smtp.126.com"   password="*"   port="25"   userName="*@126.com"   />
      </smtp>
    </mailSettings>
  </system.net>

我們使用了126的郵箱,其中的用戶名與密碼被省略。
創建PasswordRecovery.aspx,放入PasswordRecovery控件

CODE:
        <asp:PasswordRecovery ID="PasswordRecovery1" runat="server">
        </asp:PasswordRecovery>

測試:
打開註冊時填寫的郵箱就可以看到了。
 
我們就可以使用新的密碼來登錄站點了。

11.總結

membership在接觸之前,覺得比較神祕,在接觸之後,發現其實也不難懂,而且與login系列控件配合得很完美。如果你想要快速搭建一個用戶管理的平臺,這是一個不錯的選擇,是偷懶者的首選。
如果你嫌MS的控件太難看,也沒有關係,因爲它又有多種多樣的模板,通過自定義模板你就能實現你要看的界面。
不過,membership是設計得適合大多數的情況,所以也是一種萬金油的做法,與你要的功能可能不完全符合,不過,學習一下它的做法,學習它數據庫的設計,不也是一個好東西嗎?
發佈了55 篇原創文章 · 獲贊 1 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章