ASP.NET2.0角色控制和管理

安全性必要性
對於網站而言,用戶身份認證與權限管理是非常重要的部分。
通過用戶和密碼,對用戶進行身份驗證,並指派他可訪問的資源,這部分工作一直都是網站開發的重要內容。
在另外一些情況下,需要根據用戶的身份進行權限識別,不同用戶訪問相同頁面,也需要顯示不同的內容。
這涉及到用戶權限管理部人,也是風站開發的核心內容。
角色控制概述
memberhip和role memager能夠非常好的解決這個問題,不但可以對用戶的登陸信息進行統一管理,還可以就用戶的權限進行分類管理,讓開發者方便的就網站權限與安全必進行設定。
Login控件更提從了一種非常方便的建造登陸與用戶管理信息的法
認證與授權
asp.net通過與iis協同工作來進行授權管理。共兩種身份認證方式。
通過查詢acls列表或者許中證來判定該訪問是否擁有瀏覽的以權利。
通過url認證
認證方式
當用戶以訪問某網站的時侯。兩種授權方式分別會進行不同的動作。
第一種認證方式會根據用戶的登陸信息來判定asp.net針對該用戶所指定的系統帳號,然後再判斷系統帳號是否對被請求的本地資源有訪問權限。
第二種身份認證方式通過檢查asp.net配置文件來進行授權認證。
Asp.net的頁面認證方式中,可以使用以下三種方式進行身份認證。
通過修改config文件中的authentication屬性,可以配置不同的認證方式。
取值
描述
None
不進行授以與身份驗證
Windows
基於windows身份驗證,首先判斷window用戶的身份和組
Forms
基於cookie的身份認證機制
Passport
使用PassPort SDK進行二次開發
<configuration>
       <system.web>
              <authentication mode=”Forms”/>
       </system.web>
</configuration>
window認證方式
window認證方式通過使用windowsprincipal類對用戶的windows身份進行判定,然後根據用戶所屬的window身份組來進行認證。
需用在web.config里加上<authentication mode=”Windows”/>
Demo1(Lesson6/windowsAuthentication.apx//web.config)
Page_Load(Object sender, EventArgs e){
        AuthUser.Text = User.Identity.Name;   //用戶的名稱
        AuthType.Text = User.Identity.AuthenticationType; //用戶的認證類型(NTLW)
}
Form認證方式
Forms認證方式是在窗體內提供用戶輸入id和密碼的地方,並根據用戶輸入的id和密碼進行身份認證。
Forms認證方式同時還使用cookie記錄用戶的信息當用戶訪問其他頁面的時侯,程序通過訪問cookie來獲得用戶的身份信息。
Forms認證方式配置文件
<authentication mode="Forms">
       <forms name=".ASPXUSERDEMO" loginUrl="Formslogin.aspx" protection="All" timeout="60" />
</authentication>
Forms認證配置文件講解
配置文件中的屬性意義如下表所示
屬性
描述
LoginUrl
指定一個用於登陸的頁面
Name
Cookie的名字,注意,如果一個服務器有很多應用的話,要給cookie其不同的名字。
TimeOut
Cookie的存活時間默認值是30分鐘
Protection
Cookie被保存的方式
Path
Cookie的保存路徑
Protection屬性
Protection是用來描述cookie的保存方式的,有下列四個可選擇項目
屬性
描述
None
不使用任何方法保護cookie
Encryption
使用des或者三層des對cookie進行加密,但是並不對cookie傳輸中是否被監聽或篡改進行監視。
Validation
監視cookie,保證傳輸過程中不會被監聽或者篡改。但是並不對cookie進行加密。
All
同時使用Encryption和Validation
Demo2(lesson6/)
Web.config
<authentication mode="Forms">
       <forms name=".ASPXUSERDEMO" loginUrl="Formslogin.aspx" protection="All" timeout="60" />
</authentication>
FormsLogin.apx
單擊的登陸事件的內容如下:
If (UserEmail.Value = = "[email protected]" And UserPass.Value = = "password")
{FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked);}
else;//將頁面轉到調用登陸窗口的頁,同時傳送用戶的基本信息
 { Msg.Text = "用戶名密碼錯誤,請重新嘗試"}
Default.apx
主頁加載事件的內容
Welcome.Text = "Hello, " + User.Identity.Name;//顯示註冊用戶的信息
註銷用戶事件的內容
FormsAuthentication.SignOut();//註銷用戶信息
Response.Redirect("Formslogin.aspx")
使用文件記錄用戶的帳號和密碼
用戶還可以通過指定可訪問的用戶名和密碼來指定訪問用戶。
<authentication>
       <credentials passwordFormat=”SHA1”>
              <user name=”Mary” password=”adadfsdfdfdsf”/>
              <user name=”John” password=”adfsdfdfdsf”/>
       </credentials>
</authentication>
在指定密碼的保存方式時,可以指定密碼的存方式,有三種方式。
Hash類型
描述
Clear
不加密進行存儲
SHA1
使用SHA1進行加密
MD5
使用MD5進行加密
授權用戶與角色
用戶訪問還可以通過定製訪問規則來實現對用戶的角色分配。
<authorization>
       <allow users=”[email protected]”/>
       <allow roles=”Admin”/>
       <deny user=”*”/>
</authorization>
verb=”post,get”
*(所有用戶)?(匿名用戶)
使用用戶管理控件
Login //登錄控件
LoginStatus //用來表明當前的登錄狀態
CreateUserWizard //創建新用戶模板
LoginView //根據用戶是否登錄來選擇顯示內容
ChangePassword //用來更改用戶的密碼
Demo3
Web.config
<authentication mode=”Forms”/>
Site.master
<asp:loginstatus ID="loginstatus" runat="server"/> //用來表明當前的登錄狀態
把它的view初始值設置爲Login
login.aspx
<asp:Login ID="Login1" runat="server" BackColor="#F7F7DE" BorderColor="#CCCC99" BorderStyle="Solid" BorderWidth="1px" CreateUserText="創建用戶" CreateUserUrl="~/CreateUser.aspx" Font-Names="Verdana"
        Font-Size="10pt">
        <TitleTextStyle BackColor="#6B696B" Font-Bold="True" ForeColor="#FFFFFF" />
</asp:Login>
添加上上面的兩項,可以在登錄頁面上看到有新建用戶的鏈接。
Default.aspx
<asp:loginview ID="LoginView1" runat="server">
    <loggedintemplate>
      <h1>
        <asp:loginname id="LoginName1" runat="server" formatstring="Welcome {0}" />
      </h1>
    </loggedintemplate>
    <anonymoustemplate>
      <h1>Welcome to Login Controls</h1>
      <asp:login ID="Login1" runat="server" createuserurl="CreateUser.aspx" createusertext="Create a New Account" />
    </anonymoustemplate>
   
 </asp:LoginView>
CreateUser.apx
<asp:CreateUserWizard ID="CreateUserWizard1" runat="server" ContinueDestinationPageUrl="~/Default.aspx">
<WizardSteps>
           <asp:CreateUserWizardStep runat="server">
           </asp:CreateUserWizardStep>
           <asp:CompleteWizardStep runat="server">
           </asp:CompleteWizardStep>
</WizardSteps>
</asp:CreateUserWizard>
<asp:CompleteWizardStep runat="server"></asp:CompleteWizardStep>
</WizardSteps>
</asp:CreateUserWizard>
其實直接拖動一個這樣的控件就可以產生上面的內容。
在新建用戶時應注意,用戶在可以隨便定,但密碼爲了字全,微軟規定要有最少七位,另外還得有個特殊字符。
成員管理
成員管理特性是基於membership和memberhipuser兩個類。可以使用memship類爲asp.net創建用戶。
Memberhip類還可以完成以下工作:
建立一個新的membershipuser
可以對用戶身份進行驗證
找回一個membershipuer實例
更新一個membershipuser實例
通過不同的條件尋找一個用戶
獲得當前在線用戶數量
刪除一已經不再需用的帳戶
membershipuser類中以完成以下工作:
訪問一個membershipuser示例的屬性
找回一個用戶的密碼
修改一個用戶的密碼
修改一個用戶的密碼問題以及密碼問題的答案
爲一個已經因爲多次嘗試密碼挫敗而鎖定的用戶解除鎖定
角色管理
角色管理在於role類實現
通過角色管理類,可以實現以下工作:
新建一個角色;刪除一種角色;給一個用戶分配角色;去除一個用戶的角色;判斷用戶是否被授權給一個特殊的角色;在一種角色中尋找一個用戶,從一個用戶信息中獲得他所具有的角色信息。
創建用戶
通過調用membership的createuser方法,可以創建用戶,需要注意的是membership的密碼要求長於7位,並需用有至少一個特殊字符。
Demo4(membership)
Web.config
<system.web>
<roleManager enabled="true" />
</system.web>
<location path="secured">
       <system.web>
              <authorization>
                     <deny users="?"/>
                     <allow users="*"/>
              </authorization>
       </system.web>
</location>
<location path="administrators_role">
       <system.web>
              <authorization>
                     <allow roles="Administrators" />
                     <deny users="*"/>
              </authorization>
       </system.web>
</location>
CreatingUsers.aspx
<一>添加新用戶的單擊事件
string userName = txtUserId.Text;
string password= txtPassword.Text;
string email = txtEmail.Text;
string passwordQuestion= ddlPasswordQuestion.SelectedValue;
string passwordAnswer = txtPasswordAnswer.Text;
MembershipCreateStatus result
Membership.CreateUser(userName, password, email, passwordQuestion, passwordAnswer, True, result);
lblResults.Visible = True;
switch result
{
Case MembershipCreateStatus.Success
        txtUserId.Text = “”;
        txtPassword.Text =””;
        txtEmail.Text = “”;
        ddlPasswordQuestion.SelectedIndex = -1;
        txtPasswordAnswer.Text = “”;
        lblResults.Text = "User successfully created!";
        break;
      Case MembershipCreateStatus.InvalidUserName
        lblResults.Text = "這個用戶名是無效的,請重新輸入一個新的名稱。";
        break;
      Case MembershipCreateStatus.InvalidPassword
        lblResults.Text = "密碼不正確,請重新輸入";
        break;
      Case MembershipCreateStatus.InvalidEmail
        lblResults.Text = "電子郵件格式不正確,請重新輸入";
        break;
      Case MembershipCreateStatus.InvalidQuestion
        lblResults.Text = "問題的格試不正確,請重新輸入";
              break;
      Case MembershipCreateStatus.InvalidAnswer
        lblResults.Text = "密碼回答不正確,請重新輸入";
              break;
      Case MembershipCreateStatus.DuplicateUsername
        lblResults.Text = "用戶已經被使用,請重新輸入";
              break;
      Case MembershipCreateStatus.DuplicateEmail
        lblResults.Text = "電子郵件已經在使用,請輸入一個不同是的電子郵件地址”;
              break;
 Case Else
        lblResults.Text = "An error occurred while creating the user."
}
true是否用戶一開通就被授權。
Login.apx
<二>登錄事件
string userName = txtUserId.Text;
string password = txtPassword.Text;
if (Membership.ValidateUser(userName, password))
{
      If  ! (Request.QueryString("ReturnUrl") Is nothing) //如果該項有值則切換到轉向此頁的頁面
      {
        FormsAuthentication.RedirectFromLoginPage(userName, False);轉到調用這個頁的頁
      }
      else
      {
       FormsAuthentication.SetAuthCookie(userName, False);不轉到其它頁
        Response.Redirect("~/secured/menu.aspx");轉向其它的頁面
      }
else
 {
      lblResults.Visible = True;
       lblResults.Text = "Unsuccessful login. Please re-enter your information and try again.";
 
      If (Not Membership.GetUser(userName) Is Nothing)如果驗證不正確,且又存在該用戶
          If(Membership.GetUser(userName).IsLockedOut = true)用戶是否已鎖定(5次)
               lblResults.Text = lblResults.Text & " <b>Your account has been locked out.</b>"
          End If
      End If
    End If
<三>用戶的註銷
FormsAuthentication.SignOut();//註銷用戶
Roles.DeleteCookie();//清除cookie
FormsAuthentication.RedirectToLoginPage();//註銷後轉回到登陸頁
用戶信息的顯示
MemberShipUser memUser=MemberShip.GegUser();
<%=Server.HtmleEncode(memUser.UserName)%>//用戶名
<%=Server.HtmleEncode(memUser.Email)%>//用戶的電子郵件
<%=Server.HtmleEncode(memUser.IsApproved)%>//是否批准和通過
<%=Server.HtmleEncode(memUser.PasswordQuestion)%>//用戶的密碼問題
<%=Server.HtmleEncode(memUser.IsOnline)%>// 用戶是否在線
<%=Server.HtmleEncode(memUser.LastLoginDate.ToString(“F”))%>//最後登錄時間
<%=Server.HtmleEncode(memUser.LastActivityDate.ToString(“F”))%>//最後活動時間
<%=Server.HtmleEncode(memUser.LastPasswordChangeDate.ToString(“F”)%>//最後一次更密碼時間
<四>刪除當前登錄的用戶信息
if(MemberShip.Deleteuser(User.Identity.Name))
{
       FormAuthentication.SignOut();
       Roles.DeleteCookie();
       Response.Redirect(“~/CreatingUsers.aspx”);
}
else
{
lblReult.Visible=True;
lblReult.Text=”這個用戶不能被刪除”;
}
<五>更新用戶信息
(1)       數據源的定義
<asp:ObjectDataSource ID=”ObjectDataSource1” runat=”server”
DataObjectTypeName=”System.Web.Security.MemberhipUser”
SelectMethod=”GetUser”
TypeName=”System.Web.Security.Membership”/>
(2)       顯示用戶數據的控件
<asp:DetialsView AutoGenerateRows=”False” DataSourceID=”ObjectDataSource1”
       ID=”DetalisView1” runat=”server” AutoGeneratiEditButton=”true”
       OnItemUpdating=”DatailsView_ItemUpdating”>
       <Fields>
       <asp:BindField DataField=”CretionDate” HeaderText=”CreationDate”
        ReadOnly=”true” SortExpression=”CreationDate”/>
       <asp:BindField DataField=”Comment” HeaderText=”Comment”
        ReadOnly=”true” SortExpression=”Comment”/>
       <asp:BindField DataField=”ProviderName” HeaderText=”ProviderName”
        ReadOnly=”true” SortExpression=”ProviderName”/>
       …………..
       </Field>
</asp:DetialsView>
private void DetailsView1-ItemUpdating(Object Sender,DetailsViewUpdateEventArgs e)
{
       MembershipUser memUser=Memberhip.GetUser();
       MemUser.Email=e.NewValues(0).ToString();
       MemUser.Comment=e.NewValues(1).ToString();
       Memberhip.UpdateUser(memUser);
       e.Cancel=true;
       DetailsView1.ChangeMode(DetailsViewMode.ReadOnly);
}
<六>用戶的解鎖
MembershipUser memUser=Membership.GetUser(txtUserName.text);
If(!memUser is Nothing &&memUer.IsLockedOut= =true)
{
       memUer.UnlockUser();
}
DetailsView1.DataBind();
Private void Page_Load(Object sender,System.EventArg e)
{
       if (!Page.IspostBack)
{
       txtUserName.Text=User.Identity.Name;
}
}
 
<七>角色的添加
Roles.CreateRole(txtCreateRole.Text);
<八>角色的刪除
Roles.DeleteRole(listboxRoles.SelectedValue);
<九>在列表中添加所有的角色
ListboxRoles.DataSource=Roles.GetAllRoles();
<十>查看角色是否存在
Roles.RoleExists(“Administrators”);
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章