ASP.NET身份验证机制membership入门 项目
面说了很多关于membership的内容,感觉内容有点凌乱,内容都是一个个知识点,下面我们通过一个小的项目,来把所有的相关内容串一下。
首先描述一下需求:
我们要做一个最简单的网站。有三类用户:匿名用户,员工,管理员,网站结构如下:
admin目录下的页面只允许admin角色的用户访问,employee目录下的页面只允许emp角色的用户访问。Default.aspx允许所有用户访问。Login.aspx实现登陆功能,regUser.aspx实现注册用户功能。
1.首先我们新建一个网站
2.进入C:\WINDOWS\Microsoft.NET\Framework\v2.0.xxxxx这个目录下,找到aspnet_regsql.exe,运行,并一路下一步,得到aspnetdb数据库
3.打开网站,打开web.config文件,配置membership:
- <membership defaultProvider="mySqlMembershipProvider">
- <providers>
- <add name="mySqlMembershipProvider"
- type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
- 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>
然后继续添加连接字符串:
- <connectionStrings>
- <add name="ConnectionString" connectionString="server=.;uid=sa;pwd=sa;database=aspnetdb"/>
- </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>
5.接着在项目中添加两个页面,一个首页Default.aspx一个登陆页面Default.aspx,随后继续添加forms身份验证的配置:
- <authentication mode="Forms">
- <forms loginUrl="Login.aspx"
- protection="All"
- timeout="30"
- name=".ASPXAUTH"
- path="/"
- slidingExpiration="true"
- defaultUrl="Default.aspx"
- cookieless="UseDeviceProfile"/>
- </authentication>
现在需要添加两种角色employee、admin,添加角色的方法很简单方法有很多,我们介绍最简单的一种:新建一个页面,在这个页面的page_load事件当中加入如下代码:
- protected void Page_Load(object sender, EventArgs e)
- {
- Roles.CreateRole("admin");
- Roles.CreateRole("employee");
- }
浏览一下这个页面就添加了这俩角色。
添加完角色,就该实现注册用户功能了。
regUser页面代码如下:
- <%@ Page Language="C#" AutoEventWireup="true" CodeFile="regUser.aspx.cs" Inherits="regUser" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head runat="server">
- <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>
这是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;
- 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);
- }
- }
ok,注册功能已经差不多了,现在我们开始完成登录页面。
打开Login.aspx页面,加上如下代码:
- <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head runat="server">
- <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;
- 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);
- }
- }
- }
好了,注册和登录都已经完成了,剩下的任务就是配置访问权限这一项了,其实很简单:在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就足够了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?