在ASP.NET中如何用C#.NET实现基于表单的验证

C# post方式提交Form表单 C# post方式提交Form表单。 C# post方式提交Form表单,可以支持带参数传入,供大家学习参考。 C# post提交表单。 立即下载
    
       在ASP.NET中如何用C#.NET实现基于表单的验证
                 翻译:mydotnet


    这篇文章引用到了Microsoft .NET类库中的以下名空间:
    System.Data.SqlClient
     System.Web.Security
-------------------------------
   任务:
    摘要: 
  1.要求
     2.用Visual C#.NET 创建一个ASP.NET 应用程序
  3.在Web.config文件里配置安全设置
  4.创建一个数据库表样例来存放用户资料
  5.创建Logon.aspx页面
  6.编写事件处理代码来验证用户身份
  7.创建一个Default.aspx页面
  8.附加提示
 参考文章
-------------------------------
摘要
 这篇文章示范了如何实现通过数据库存储用户信息来实现基于表单的验证.
(一)要求
 需要以下工具来实现
 1.Microsoft Visual Studio.NET
 2.Microsoft Internet Information Services(IIS) version 5.0 或者更新
 3.Microsoft SQL Server
(二)用C#.NET创建ASP.NET应用程序
 1.打开Visual Studio.NET
 2.建立一个新的ASP.NET Web应用程序,并且指定名称和路径.
(三)在Web.config文件里配置安全设置
这一节示范了如何通过添加和修改<authentication>和<authorization>节点来配置ASP.NET应用程序以实现基于表单的验证.
 1.在解决方案窗口里,打开Web.config文件.
 2.把authentication模式改为Forms(注:默认为windows)
 3.插入<Forms>标签,并且填入适当的属性.(请链接到在文章最后列出的MSDN文档或者QuickStart文档来查看这些属性)先复制下面的代码,接着再把它粘贴到<authentication>节:

<authentication mode="Forms">
 <form name=".ASPXFORMSDEMO" loginUrl="logon.aspx" protection="All" path="/" timeout="30"/>
</authentication>
(注:如果不指定loginUrl,默认为default.aspx)

 4.通过加入以下节点实现拒绝匿名访问:
<authentication>
 <deny users="?"/>
 <allow users="*"/>
</authentication>

(四)创建一个数据库表样例来存放用户资料
这一节示范了如何创建一个示例数据库来存放用户名,密码,和用户角色.如果你想要实现基于角色的安全就有必要在数据库中添加一个存放用户角色的字段.
 1.打开记事本。
 2.把下面这段脚本复制到记事本然后保存:

if exists (select * from sysobjects where id =
object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Users]
GO
CREATE TABLE [dbo].[Users] (
   [uname] [varchar] (15) NOT NULL ,
   [Pwd] [varchar] (25) NOT NULL ,
   [userRole] [varchar] (25) NOT NULL ,
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Users] WITH NOCHECK ADD
   CONSTRAINT [PK_Users] PRIMARY KEY  NONCLUSTERED
   (
      [uname]
   )  ON [PRIMARY]
GO

INSERT INTO Users values('user1','user1','Manager')
INSERT INTO Users values('user2','user2','Admin')
INSERT INTO Users values('user3','user3','User')
GO
 3.打开Microsoft SQL Server,打开查询分析器,在数据库列表里选择Pubs数据库,然后把上面的脚本粘贴过来,运行。这时会在Pubs数据库里创建一个将会在这个示例程序中用到的示例用户表。
(五)创建Logon.aspx页面
 1.在已创建好的项目里创建一个新的Web 窗体,名为Logon.aspx。
 2.在编辑器里打开Logon.aspx,切换到HTML视图。
 3.复制下面代码,然后在编辑菜单里“选择粘贴为HTML”选项,插入到<form>标签之间。
<h3>
   <font face="Verdana">Logon Page</font>
</h3>
<table>
   <tr>
      <td>Email:</td>
      <td><input id="txtUserName" type="text" runat="server"></td>
      <td><ASP:RequiredFieldValidator ControlToValidate="txtUserName"
           Display="Static" ErrorMessage="*" runat="server"
           ID="vUserName" /></td>
   </tr>
   <tr>
      <td>Password:</td>
      <td><input id="txtUserPass" type="password" runat="server"></td>
      <td><ASP:RequiredFieldValidator ControlToValidate="txtUserPass"
          Display="Static" ErrorMessage="*" runat="server"
          ID="vUserPass" />
      </td>
   </tr>
   <tr>
      <td>Persistent Cookie:</td>
      <td><ASP:CheckBox id="chkPersistCookie" runat="server" autopostback="false" /></td>
      <td></td>
   </tr>
</table>
<input type="submit" Value="Logon" runat="server" ID="cmdLogin"><p></p>
<asp:Label id="lblMsg" ForeColor="red" Font-Name="Verdana" Font-Size="10" runat="server" />

 这个页面用来显示一个登录表单以便用户可以提供他们的用户名和密码,并且记录到应用程序中。
 4.切换到设计视图,保存这个页面。

(六)编写事件处理代码来验证用户身份
 下面这些代码是放在后置代码页里的(Logon.aspx.cs)
 1.双击Logon页面打开Logon.aspx.cs文件。
 2.在后置代码文件里导入必要的名空间:
  using System.Data.SqlClient;
  using System.Web.Security;
 3.创建一个ValidateUser的函数,通过在数据库中查找用户来验证用户的身份。(请改变数据库连接字符串来指向你的数据库)
private bool ValidateUser( string userName, string passWord )
{
 SqlConnection conn;
 SqlCommand cmd;
 string lookupPassword = null;

 // Check for invalid userName.
 // userName must not be null and must be between 1 and 15 characters.
 if ( (  null == userName ) || ( 0 == userName.Length ) || ( userName.Length > 15 ) )
 {
  System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of userName failed." );
  return false;
 }

 // Check for invalid passWord.
 // passWord must not be null and must be between 1 and 25 characters.
 if ( (  null == passWord ) || ( 0 == passWord.Length ) || ( passWord.Length > 25 ) )
 {
  System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of passWord failed." );
  return false;
 }

 try
 {
  // Consult with your SQL Server administrator for an appropriate connection
  // string to use to connect to your local SQL Server.
  conn = new SqlConnection( "server=localhost;Integrated Security=SSPI;database=pubs" );
  conn.Open();

  // Create SqlCommand to select pwd field from users table given supplied userName.
  cmd = new SqlCommand( "Select pwd from users where uname=@userName", conn );
  cmd.Parameters.Add( "@userName", SqlDbType.VarChar, 25 );
  cmd.Parameters["@userName"].Value = userName;

  // Execute command and fetch pwd field into lookupPassword string.
  lookupPassword = (string) cmd.ExecuteScalar();

  // Cleanup command and connection objects.
  cmd.Dispose();
  conn.Dispose();
 }
 catch ( Exception ex )
 {
  // Add error handling here for debugging.
  // This error message should not be sent back to the caller.
  System.Diagnostics.Trace.WriteLine( "[ValidateUser] Exception " + ex.Message );
 }

 // If no password found, return false.
 if ( null == lookupPassword )
 {
  // You could write failed login attempts here to event log for additional security.
  return false;
 }

 // Compare lookupPassword and input passWord, using a case-sensitive comparison.
 return ( 0 == string.Compare( lookupPassword, passWord, false ) );

}
(注:这段代码的意思是先判断输入的用户名和密码是否符合一定的条件,如上,如果符合则连接到数据库,并且根据用户名来取出密码并返回密码,最后再判断取出的密码是否为空,如果不为空则再判断取出的密码和输入的密码是否相同,最后的false参数为不区分大小写)

 4.在cmdLogin_ServerLick事件里使用下面两种方法中的一种来产生表单验证的cookie并将页面转到指定的页面。
下面提供了两种方法的示例代码,根据你的需要来选择。
 a)在cmdLogin_ServerClick事件里调用RedirectFromLoginPage方法来自动产生表单验证cookie且将页面定向到一个指定的页面。
 private void cmdLogin_ServerClick(object sender,System.EventArgs e)
 {
  if(ValidateUser(txtUserName.value,txtUserPass.Value))

   FormsAuthentication.RedirectFromLoginPage(txtUserName.Value,chkPresistCookie.Checked);
   else
    Response.Redirect("logon.aspx",true);   

 }

 b)产生加密验证票据,创建回应的cookie,并且重定向用户。这种方式给了更多的控制权去让你如何去创建cookie,你也可以连同FormsAuthenticationTicket一起包含一些自定义的数据。
 private void cmdLogin_ServerClick(object sender,System.EventArgs e)
 {
  if(ValidateUser(txtUserName.value,txtUserPass.Value)) 
  {
   FormsAuthenticationTicket tkt;
   string cookiestr;
   HttpCookie ck;
   tkt=new FormsAuthenticationTicket(1,txtUserName.value,DateTime.Now,DateTime.Now.AddMinutes(30),chkPersistCookie.Checked,"your custom data"); //创建一个验证票据
   cookiestr=FormsAuthentication.Encrypt(tkt);//并且加密票据
   ck=new HttpCookie(FormsAuthentication.FormsCookieName,cookiestr);// 创建cookie
   if(chkpersistCookie.Checked) //如果用户选择了保存密码
    ck.Expires=tkt.Expiratioin;//设置cookie有效期
    ck.Path=FormsAuthentication.FormsCookiePath;//cookie存放路径
   Response.Cookies.Add(ck);
   string strRedirect;
   strRedirect=Request["ReturnUrl"];
   if(strRedirect==null)
    strRedirect="default.aspx";
   Response.Redirect(strRedirect,true);
  }
  else
   Reponse.Redirect("logon.aspx",true);
 }
  5.请确保在InititalizeComponent方法里有如下代码:
   this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);
  
(七)创建一个Default.aspx页面
 这一节创建一个测试页面用来作为当用户验证完之后重定向到的页面。如果用户第一次没有被记录下来就浏览到这个页,这时用户将被重定向到登录页面。
  1.把现有的WebForm1.aspx重命名为Default.aspx,然后在编辑器里打开。

  2.切换到HTML视图,复制以下代码到<form>标签之间:
 <input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
这个按钮用来注销表单验证会话。
  3.切换到设计视图,保存页面。
  4.在后置代码里导入必要的名空间:
 using System.Web.Security;
  5.双击SingOut按钮打开后置代码(Default.aspx.cs),然后把下面代码复制到cmdSingOut_ServerClick事件处理中:
  private void cmdSignOut_ServerClick(object sender,System.EventArgs e)
  {
   FormsAuthentication.SignOut();//注销 
   Response.Redirect("logon.aspx",true);
  }
  6.请确认在InititalizeComponent方法中有以下代码:
  this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
  7.保存编译项目,现在可以运行这个应用程序了。
(八)附加提示
  1.如果想要在数据库里安全地存放密码,可以在存放到数据到之前先用FormsAuthentication类里的HashPasswordForStoringInConfigFile函数来加密。(注:将会产生一个哈希密码)
  2.可以在配置文件(Web.config)里存放SQL连接信息,以便当需要时方便修改。
  3.可以增加一些代码来防止黑客使用穷举法来进行登录。例如,增加一些逻辑使用户只能有两三次的登录机会。如果用户在指定的登录次数里无法登录的话,可以在数据库里设置一个标志符来防止用户登录直到此用户访问另一个页面或者请示你的帮助。另外,也可以在需要时增加一些适当的错误处理。
  4.因为用户是基于验证cookie来识别的,所以可以在应用程序里使用安全套接层(SSL)来保护验证cookie和其它有用的信息。
  5.基于表单的验证方式要求客户端的游览器接受或者启用cookies.
  6.在<authentication>配置节里的timeout参数用来控制验证cookies重新产生的间隔时间。可以给它赋一个适当的值来提供更好的性能和安全性。
  7.在Internet上的一些代理服务器或者缓冲可能会缓存一些将会重新返回给另外一个用户的包含Set-Cookie头的Web服务器响应。因为基于表单的验证是使用cookie来验证用户的,所以通过中间代理服务器或者缓冲的话可能会引起用户会被意外地搞错为原本不是要发送给他的用户。
   
   
 参考文章:
  如果想要知道如何通过配置<credentials>节点存放用户名和密码来实现基于表单的验证的话,请参考以下GotDotNet ASP.NET QuickStart示例:
  基于表单的验证:http://www.gotdotnet.com/QuickStart/aspplus/default.aspx?url=/quickstart/aspplus/doc/formsauth.aspx
  如果想要知道如何使用XML文件来存放用户名和密码来实现基于表单的验证的话,请参考SDK文档的以下示例:
 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcookieauthenticationusinganxmlusersfile.asp
   如果想要知道更多的关于ASP.NET安全的话,请参考Microsoft .NET Framework Developer's Guide文档:
ASP.NET 安全:  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconaspnetwebapplicationsecurity.asp
   如果想知道更多关于System.Web.Security名空间的话,请参考:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWebSecurity.asp
   如果想知道更多的关于ASP.NET配置的话,请参考Microsoft .NET Framework Developer's Guide文档:
ASP.NET配置:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconaspnetconfiguration.asp
ASP.NET配置节点:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpgrfaspnetconfigurationsections.asp
  如果想知道更多关于ASP.NET安全指导的话,请参考MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/authaspdotnet.asp
  如果想知道更多关于ASP.NET的,请参考MSDN新闻组:
http://go.microsoft.com/fwlink/?linkid=5811&clcid=0x409

 这篇文章适用于:
Microsoft ASP.NET (included with the .NET Framework 1.1)
Microsoft Visual C# .NET (2003)
Microsoft ASP.NET (included with the .NET Framework) 1.0
Microsoft Visual C# .NET (2002)
Microsoft SQL Server 2000 (all editions)
Microsoft SQL Server 7.0
Microsoft SQL Server 2000 64 bit (all editions)

HFSS仿真平行线定向耦合器学习笔记 材料:FR4(玻璃纤维环氧树脂),介电常数:4.4,损耗角正切:0.02,厚度0.8mm。扫频方式:快速扫频,扫频范围:1.0GHz~3.0GHz,步进:0.01GHz。端口2是端口1关于Y轴对称,端口3,端口4是端口1和端口2关于X轴对称得到。求解中心频率:2.0GHz,迭代次数:20,收敛误差为0.02。右键设置边界条件----辐射边界。激励方式:集总端口激励。 阅读详情

相关推荐

Simulink单相桥式有源逆变电路仿真:从器件选型到波形分析(MATLAB 2018a实战)

本文基于MATLAB 2018a的Simulink平台,详细演示了单相桥式有源逆变电路的完整仿真流程。从Simscape/Power Systems库的器件选型、参数配置,到触发脉冲设置与电路连接,逐步指导搭建仿真模型。通过调整触发角α,直观展示了电路从整流到有源逆变的工作状态切换,并深入分析了负载电压、电流波形,以及逆变颠覆现象的产生条件与特征。

cake8的博客 1160

C# 之正则表达式运用

C#正则验证大全 Regex.IsMatch()正则表达式验证 需要引入命名空间 using System.Text.RegularExpressions; #region 验证文本框输入为数字 /// <summary> /// 验证是不是数字(包含整数和小数) /// </summary> ...

241

【Qt】Qt5.15在线安装避坑指南:从代理配置到组件选择的完整实践

本文详细介绍了Qt5.15在线安装的全流程避坑指南,包括代理配置、组件选择和常见问题解决方案。通过使用Fiddler工具和国内镜像源,可显著提升下载速度。文章还提供了组件选择的黄金法则和安装后的验证步骤,帮助开发者高效完成Qt5.15的安装与配置。

weixin_42550052的博客 270

[报错]Images of type float must be between -1 and 1

我用SimpleITK读取nii文件,然后用skimage.io去imshow显示是没有问题的,如下图所示: 但是,但我io.imsave时,却发生了意外的错误:Images of type float must be between -1 and 1 我查了N多资料,发现如果float类型用io.imsave()保存,需要数值在-1到1之间. 然后我灵机一动,在保存之前先进行归一化,把...

程序客栈 7384

海康机器人ID5000 系列智能读码器(三)

又過了兩個月,漸漸的對這個攝像頭的功能更加熟悉了,而實際上,我要做的功能也越來越複雜,從一開始的讀碼,到後來的通過讀二維碼控制設備,再到未讀到二維碼控制設備等,下面就對具體的細項做一個總結。了解完這些就能對ID5000這個設備,乃至很多海康的設備都能做一個二次開發。

qq_54359036的博客 3073

AgentFlow:模块化智能体框架与Flow-GRPO强化学习实战解析

在人工智能领域,大语言模型(LLM)与智能体(Agent)技术正推动着自动化任务处理的发展。其核心原理在于通过规划、执行与反馈的循环,使AI系统能够自主调用工具解决复杂问题。这一技术的价值在于突破单一模型的局限性,实现更可靠的多步骤推理。在实际应用中,智能体框架需要处理搜索、代码执行、数学计算等多种场景。本文聚焦的AgentFlow框架,正是通过模块化设计将智能体拆分为规划者、执行者、验证者和生成者四个专家模块,并引入Flow-GRPO强化学习算法进行流程内优化。该框架在搜索增强与工具调用等任务上展现出显著

weixin_42311427的博客 367

[转]在ASP.NET中如何用C#.NET实现基于表单的验证(一)

原文链接:http://support.microsoft.com/default.aspx?scid=kb;en-us;301240这篇文章引用到了Microsoft .NET类库中的以下名空间:    System.Data.SqlClient     System.Web.Security-------------------------------   任务:    摘要:   1.要求 ...

weixin_34197488的博客 150

在 IW31 录入班次与当班负责人,并让 IW38 列表同步显示:基于 IWO10018 + IWOC0004 的一套可落地增强方案

摘要 本文详细介绍了在SAP PM模块中实现工厂设备维护订单增强的完整方案,重点解决两个核心需求:在订单创建时新增班次负责人和班次字段,并在订单列表中直接显示这些信息。文章从需求分析、技术设计到具体实现步骤进行了系统阐述。 关键实现步骤包括: 通过CI_AUFK结构扩展AUFK表,确保字段持久化存储 使用IWO10018增强在IW31/IW32/IW33事务中添加输入界面 通过IWOC0004增强在IW38订单列表中显示新增字段 采用优化的数据填充策略提升性能 该方案不仅满足业务需求,还考虑了用户体验和系统

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 176

从光到JPEG:计算摄影的成像链路全解析

数字图像的本质是光子经光学系统、光电转换、数字处理最终编码为JPEG的物理-数学过程。理解这一链路,需掌握镜头像差与景深的物理约束、CMOS传感器中光子-电子转换的噪声机制、ISP流水线中白平衡/降噪/色彩映射等不可逆变换,以及JPEG如何利用人眼视觉特性进行有损压缩。这些环节共同构成计算摄影的技术基底——它并非替代光学,而是对物理限制的建模与补偿。典型应用场景包括手机夜景多帧合成、背景虚化模拟、HDR动态范围扩展及AI驱动的RAW域重建。本文聚焦真实产线级参数与调试逻辑,揭示ISO、Bayer阵列、YUV

weixin_33910385的博客 433

LPDDR6 技术标准详解(JESD209-6)

是继 LPDDR5/5X 之后的新一代低功耗 DRAM 标准,专为满足移动终端、AI、边缘计算等高带宽、低功耗场景而设计。该标准通过全新架构、动态功耗控制机制和增强型数据完整性机制,实现性能、能效与可靠性的全面升级。LPDDR6 并非仅是速度升级,更是内存架构设计思路的演进,围绕“低功耗 + 高带宽 + 强安全”的三维目标,构建下一代 SoC 平台关键基础。✅ 高带宽:支持 32B/64B 动态突发✅ 低功耗:动态电压、通道切换✅ 高可靠性:ECC + 自测试 + 安全区。

weixin_43199439的博客 2580

基于FPGA的以太网设计(1)----大白话解释什么是以太网

基于FPGA的千兆以太网设计(1)----大白话解释什么是以太网

孤独的单刀 3872

HOW TO:使用 Visual C# .NET 在采用基于表单身份验证的 ASP.NET 应用程序中实现基于角色的安全性 (From MSDN)

This article was previously published under Q311495 For a Microsoft Visual Basic .NET version of this article, see 306238. This article refers to the following Microsoft .NET Framework Class Library

841

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

[转]在ASP.NET中如何用C#.NET实现基于表单的验证(二)

(五)创建Logon.aspx页面1.在已创建好的项目里创建一个新的Web 窗体,名为Logon.aspx。2.在编辑器里打开Logon.aspx,切换到HTML视图。3.复制下面代码,然后在编辑菜单里“选择粘贴为HTML”选项,插入到标签之间。  1h3> 2   font face="Verdana">Logon Pagefont> 3h3> 4table> 5   tr> 6      td

生姜有味 966

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: 谈谈 ASP.NET 规划阶段的设计
下一篇: 通过 ADO.NET 操纵 Access 数据库
JavaProgramers
博客等级 码龄22年 660粉丝 304原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值