十一呆着没有意思,近一点的地方能玩的都完了.现在也就只好呆着学习了.今天学习了一下asp.net中的用户验证部分,总结一下也就下面一点东西:
1.asp.net为我们提供了三种验证方式:Forms,Windows,PassPort我们可以在web.config文件中进行配置.如:
<system.web>
<
authentication
mode
="Forms"
>
</
authentication
></system.web>
把验证模式mode设为Forms(基本表单验证模式,注意大小写).下面说明一下各种验证模式:
1.表单验证:是一种依赖于cookie的验证模式,允许用户自定义用户名,密码的存储机制,可以是数据库,配置文件也可以是任意xml文件.
2.PassPort验证:是微软提供的一个集中式的验证服务,好象还要收费.
3.Windows验证:主要用于内部网络的一种验证模式,用户使用系统帐号进行登陆
我今天主要学习了一下forms验证模式,扩充一下以前那个留言板程序,实现只有登陆的用户才可以留言的功能.
1.配置站点验证模式为表单验证模式,在其中存储用户和密码对并允许所有用户访问该站点下的所有文件:
<
system
.web
>
<
authentication
mode
="Forms"
>
<
forms
loginUrl
="manage/Login.aspx"
name
=".MyCookie"
protection
="All"
>
<
credentials
passwordFormat
="Clear"
>
<
user
name
="Nev.Jension"
password
="123456"
/>
</
credentials
>
</
forms
>
</
authentication
>
<
authorization
>
<
allow
users
="*"
/>
</
authorization
>
</
system.web
>
2.建立manage子目录,该目录只有通过验证的用户才可以访问.在其下添加longin.aspx和Post.aspx文件.同时在下面添加一个web.config文件以控制该文件文件夹下文件的访问权限
<?
xml version="1.0"
?>
<
configuration
>
<
system
.web
>
<
authorization
>
<
deny
users
="?"
/>
</
authorization
>
</
system.web
>
</
configuration
>
3.在登陆页面的登陆事件中实现下面代码:
protected
void
Login_Click(
object
sender, EventArgs e)
...
{
if (IsPostBack)
...{
//使用配置文件中的用户信息验证用户
if (FormsAuthentication.Authenticate(this.userName.Text, this.userPassword.Text))
...{
FormsAuthentication.RedirectFromLoginPage(this.userName.Text, false);
}
else
...{
this.Label1.Text = "用户名或密码错误";
this.Label1.Visible=true;
}
//从数据库中取数据验证用户
/**//*UserAuthentication userAuth = new UserAuthentication();
if (userAuth.Authentication(this.userName.Text,this.userPassword.Text))
{
FormsAuthentication.RedirectFromLoginPage(this.userName.Text, false);
}
else
{
this.Label1.Text = "用户名或密码错误";
this.Label1.Visible = true;
}*/
}
FormsAuthenticationt提供的验证的主要功能和信息.我采用了在数据库中存储用户信息,密码使用了md5实现加密:
using
System;
using
System.Data;
using
System.Configuration;
using
System.Web;
using
System.Web.Security;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.WebControls.WebParts;
using
System.Web.UI.HtmlControls;
using
System.Data.OleDb;
using
System.Security.Cryptography;
/**/
/// <summary>
/// Summary description for UserAuthentication
/// </summary>
public
class
UserAuthentication
...
{
private string conStr=System.Configuration.ConfigurationManager.ConnectionStrings["constr1"].ConnectionString;
private OleDbConnection con;
OleDbCommand command;
public UserAuthentication()
...{
}
public UserAuthentication(string in_constr)
...{
this.conStr = in_constr;
}
/**//// <summary>
/// 用户验证
/// </summary>
/// <param name="in_userName">用户名</param>
/// <param name="in_password">密码</param>
/// <returns>true:验证通过</returns>
public bool Authentication(string in_userName,string in_password)
...{
con = new OleDbConnection(this.conStr);
string sql = "select * from sys_users where name='" + in_userName + "' and password='" + GetMd5CodingString(in_password) + "'";
command = new OleDbCommand(sql,con);
con.Open();
OleDbDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
con.Close();
return result;
}
/**//// <summary>
/// 用户注册
/// </summary>
/// <param name="in_userName">名字</param>
/// <param name="in_password">密码</param>
/// <returns></returns>
public bool AddUser(string in_userName, string in_password)
...{
con = new OleDbConnection(this.conStr);
string sql = "insert into sys_users(name,[password]) values('" + in_userName + "','" + GetMd5CodingString(in_password) + "')";
command = new OleDbCommand(sql, con);
con.Open();
int i_reuslt = command.ExecuteNonQuery();
con.Close();
return i_reuslt==1;
}
/**//// <summary>
/// 检测用户是否存在
/// </summary>
/// <param name="in_userName">检测名</param>
/// <returns></returns>
public bool UserExist(string in_userName)
...{
con = new OleDbConnection(this.conStr);
string sql = "select * from sys_users where name='" + in_userName + "'";
command = new OleDbCommand(sql, con);
con.Open();
bool result = command.ExecuteReader().Read();
con.Close();
return result;
}
/**//// <summary>
/// 获得MD5的加密字符串
/// </summary>
/// <param name="in_str">明文</param>
/// <returns>密文</returns>
public static string GetMd5CodingString(string in_str)
...{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] result = md5.ComputeHash(System.Text.Encoding.Unicode.GetBytes(in_str.ToCharArray()));
return BitConverter.ToString(result);
}
}
为了防止注销后用户后退回去看到管理页面,我弄了半天ie缓存也没怎么弄明白.最后是通过在管理页面中加入如下代码还实现的(是管理页面不在浏览器端缓存)Response.Cache.SetNoStore();这样可能会影响响应速度,不知道各位有没有更好的方法.
今天还发现了一个不错的网站:http://aspalliance.com/
欢迎大家指点,共同学习才是我们的目的.
代码地址:http://www.uploadwiz.com/WIZ118216533