安全性必要性
对于网站而言,用户身份认证与权限管理是非常重要的部分。
通过用户和密码,对用户进行身份验证,并指派他可访问的资源,这部分工作一直都是网站开发的重要内容。
在另外一些情况下,需要根据用户的身份进行权限识别,不同用户访问相同页面,也需要显示不同的内容。
这涉及到用户权限管理部人,也是风站开发的核心内容。
角色控制概述
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 = = "someone@www.frontfree.com" 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=”supper3000@gmail.com”/>
<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”);