(搬运).net起步 (身份验证机制 membership 项目演练)

xiaoxiao2021-02-28  13

实验需求:

我们要做一个最简单的网站。有三类用户:匿名用户,员工,管理员,网站结构如下:

admin 目录下的页面只允许 admin 角色的用户访问, employee 目录下的页面只允许 emp 角色的用户访问。 Default.aspx 允许所有用户访问。Login.aspx 实现登陆功能, regUser.aspx 实现注册用户功能。

1. 首先我们新建一个网站

2. 进入 C:\WINDOWS\Microsoft.NET\Framework\v4.0.xxxxx 这个目录下,找到 aspnet_regsql.exe ,运行,并一路下一步,得到 aspnetdb 数据库。

3. 打开网站 , 打开 web.config 文件,配置 membership :

<membership defaultProvider ="mySqlMembershipProvider"> <providers> <add name="mySqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ConnectionString" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" applicationName="TestMembership" requiresUniqueEmail="true" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression=""/> </providers> </membership>然后继续添加连接字符串(此配置要与你实际数据库连接符合,更改 uid 和pwd ): <connectionStrings> <add name ="ConnectionString" connectionString="Integrated Security=sspi;server=.;database=aspnetdb;connect timeout=30"/> </connectionStrings>4. 接着配置 roleManager : <roleManager enabled="true" defaultProvider="myAspNetSqlRoleProvider"> <providers> <add name="myAspNetSqlRoleProvider" connectionStringName="ConnectionString" applicationName="TestMembership" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> </providers> </roleManager>PS:

roleManager 元素:roleManager 元素为角色管理配置应用程序。

5. 接着在项目中添加两个页面,一个首页 Default.aspx 一个登陆页面Login.aspx ,随后继续添加 forms 身份验证的配置:

<authentication mode="Forms"> <forms loginUrl="Login.aspx" protection="All" timeout="30" name=".ASPXAUTH" path="/" slidingExpiration="true" defaultUrl="Default.aspx" cookieless="UseDeviceProfile"></forms> </authentication> 现在需要添加两种角色 employee 、 admin ,添加角色的方法很多,我们介绍最简单的一种:新建一个页面,在这个页面的 page_load 事件当中加入如下代码:

protected void Page_Load(object sender, EventArgs e) { Roles.CreateRole("admin"); Roles.CreateRole("employee"); } //using System.Web.Security;浏览一下这个页面就添加了这俩角色。 添加完角色,就该实现注册用户功能了。 regUser 页面代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="regUser.aspx.cs" Inherits="_3_4.regUser" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form id="form1" runat="server"> <table border="0" cellpadding="0" cellspacing="0"> <tr> <td>用户名:</td> <td><asp:TextBox runat="server" ID="txtName"></asp:TextBox></td> </tr> <tr> <td>密码:</td> <td><asp:TextBox runat="server" ID="txtPwd" TextMode="Password"></asp:TextBox></td> </tr> <tr> <td>邮箱:</td> <td><asp:TextBox runat="server" ID="txtEmail"></asp:TextBox></td> </tr> <tr> <td colspan="2"><asp:Button runat="server" ID="btnReg" Text="注册" OnClick="btnReg_Click" /></td> </tr> </table> </form> </body> </html>

PS: cellspacing设置为“0”,显示的结果就是第一个表格的每个单元格之间的距离为0。若将表格边框设为“0”,则单元格的距离就是0了 cellpadding属性用来指定单元格内容与单元格边界之间的空白距离的大小 。此属性的参数值也是数字,表示单元格内容与上下边界之间空白距离的高度所占像素点数以及单元格内容与左右边界之间空白距离的宽度所占的像素点数。 这是 regUser.aspx.cs 文件中的代码:

using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; namespace _3_4 { public partial class regUser : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnReg_Click(object sender, EventArgs e) { /* 这里仅仅是为了演示 Membership 功能 , 所以验证、错误捕获等在此省略 * 由于我们在 web.config 中将 requiresQuestionAndAnswer 设为false * 所以在这里只需要调用 3 个参数的重载即可 * */

Membership.CreateUser(txtName.Text, txtPwd.Text, txtEmail.Text); // 将刚刚注册的用户添加 Employee 角色 Roles.AddUserToRole(txtName.Text, "employee"); // 注册成功 , 将用户跳转到默认页面 // 所谓默认页面 , 就是在前面配置时 forms 节点下 defaultUrl 指定的页面 FormsAuthentication.RedirectFromLoginPage(txtName.Text, false); } }} PS: FormsAuthentication.RedirectFromLoginPage 方法 (String, Boolean): 将身份验证的用户重定向回最初请求的 URL 或默认 URL;其中第一个参数为经过身份验证的用户名;第二个参数true 若要创建一个持久性 cookie (一种跨浏览器会话保存);否则为 false。

ok ,注册功能已经差不多了,现在我们开始完成登录页面。 打开 Login.aspx 页面,加上如下代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="_3_4.Login" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>登录</title> </head> <body> <form id="form1" runat="server"> <table border="0" cellpadding="0" cellspacing="0"> <tr> <td>用户名:</td> <td><asp:TextBox runat="server" ID="txtName"></asp:TextBox></td> </tr> <tr> <td>密码:</td> <td><asp:TextBox runat="server" ID="txtPwd" TextMode="Password"></asp:TextBox></td> </tr> <tr> <td colspan="2"><asp:Button runat="server" Text="登录" ID="btnLogin" OnClick="btnLogin_Click" /></td> </tr> </table> </form> </body> </html> Login.aspx.cs 代码如下:

using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; namespace _3_4 { public partial class Login : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnLogin_Click(object sender, EventArgs e) { if(Membership.ValidateUser(txtName.Text,txtPwd.Text)) { // 登录成功向浏览器写入身份票据 FormsAuthentication.SetAuthCookie(txtName.Text, false); // 跳转回最初请求的 url 或是默认 url // 注 : 所谓最初请求的 url 是指 : 如果我未经登录 // 直接访问 admin/admin.aspx 这个页面 , 那么将会跳转到该登录页面 // 如果登录成功 , 则此方法将会以登录用户的身份跳转回 //admin/admin.aspx 页面 FormsAuthentication.RedirectFromLoginPage(txtName.Text, false); } else { ClientScript.RegisterStartupScript(this.GetType(), "", "alert('用户名或密码错误!');", true); } } } }

PS: FormsAuthentication.SetAuthCookie 方法 (String, Boolean): 为提供的用户名创建一个身份验证票证,并将其添加到响应的 Cookie 集合或 URL;第一个参数是已验证的用户的名称,这不必映射到 Windows 帐户;第二个参数,若要创建持久 Cookie(跨浏览器会话保存的 Cookie),则为 true;否则为 false。 ClientScript.RegisterStartupScript 方法: 运行前端页面JS脚本,this.GetType()即指代当前页面Page

好了,注册和登录都已经完成了,剩下的任务就是配置访问权限这一项了,其实很简单:在 admin 和 employee 目录下分别添加两个 web.config 文件admin 目录下的 web.config 内容如下:

<configuration> <appSettings/> <connectionStrings/> <system.web> <authorization> <allow roles="admin"/> <deny users="*"/> </authorization> </system.web> </configuration> 表示所有具有 admin 角色的用户允许访问,除此之外全部拒绝访问。employee 目录下的 web.config 内容如下:

<configuration> <appSettings/> <connectionStrings/> <system.web> <authorization> <allow roles="employee"/> <deny users="*"/> </authorization> </system.web> </configuration> 同 admin 目录下的配置, * 是通配符,代表所有用户,?代表所有匿名用户 到这里,我们实现的功能有:登录,注册,权限控制。一个网站所需要的功能基本上都已经实现了,项目有点简单,但是功能齐全。一般来说 80% 的站点使用 membership 就足够了。

转载请注明原文地址: https://www.6miu.com/read-199999.html

最新回复(0)