安全性必要性
對於網站而言,用戶身份認證與權限管理是非常重要的部分。
通過用戶和密碼,對用戶進行身份驗證,並指派他可訪問的資源,這部分工作一直都是網站開發的重要內容。
在另外一些情況下,需要根據用戶的身份進行權限識別,不同用戶訪問相同頁面,也需要顯示不同的內容。
這涉及到用戶權限管理部人,也是風站開發的核心內容。
角色控制概述
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
單擊的登陸事件的內容如下:
{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 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”);