在vs.net 2005中实现窗体认证功能和在vs.net 2003中实现的过程是一样的,
第一:在登陆按钮实现验证用户登录,然后将用户信息存放于一个cookie中,即会话cookie,代码如下:
protected void Button1_Click( object sender, EventArgs e)
... {
Users user = new Users(this.TextBox1.Text.Trim());
bool isAut = user.isAuthetic(this.TextBox2.Text.Trim())>0;
if (isAut == true)
...{
string role = user.GetRole();
// 创建身份验证票证并将角色存储在
// 该身份验证票证的自定义 UserData 属性中
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket
(
1 , // 版本
this.TextBox1.Text.Trim(),// 用户名
DateTime.Now ,// 创建
DateTime.Now.AddMinutes(1), // 到期
false , // 永久
role // 用户数据
);
// 对票证进行加密。
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
// 创建一个 cookie 并将加密的票证添加到,该 cookie 作为数据。
HttpCookie authCookie = new HttpCookie(
FormsAuthentication.FormsCookieName,
encryptedTicket
);
// 将该 cookie 添加到传出 cookie 集合。
Response.Cookies.Add(authCookie);
Response.Redirect("~/Adminstrator/index.aspx");
}
else
...{
this.Label1.Text = "用户名或密码错误";
}
}
第二:在gobal.asax中的Application_AuthenticateRequest函数中,实现对登陆成功生成的cookie信息提出,处理。
... {
// 提取窗体身份验证 cookie
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
if (null == authCookie)
...{
// 没有身份验证 cookie。
return;
}
FormsAuthenticationTicket authTicket = null;
try
...{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
}
catch (Exception ex)
...{
// 记录异常情况详细信息(为简便起见,已省略)
ex.ToString();
return;
}
if (null == authTicket)
...{
// 无法解密 Cookie。
return;
}
// 创建票证后,为 UserData 属性指定一个
// 角色名的以管道符分隔的字符串。
string[] roles = authTicket.UserData.Split(new char[] ...{ '|' });
// 创建一个标识对象
FormsIdentity id = new FormsIdentity(authTicket);
// 该主体将通过整个请求。
System.Security.Principal.GenericPrincipal principal = new
System.Security.Principal.GenericPrincipal (id, roles);
// 将新的主体对象附加到当前的 HttpContext 对象
Context.User = principal;
Context.Items.Add("LoginID", roles[roles.Length-1]);
}
但是有一个问题的是,在vs.net2005中,当你创建一个gobal.asax文件时,只是包含了 Application_Start,void Application_End,Application_Error,及Session_Start,Session_End,但是处理Cookie是要在其Application_AuthenticateRequest函数中实现的。那如何解决该问题呢?在csdn和msdn中也没找到具体的实现办法,最后抱着试试看的心理,自己在Gobal.asax中创建Application_BeginRequest,Application_EndRequest,Application_AuthenticateRequest这三个函数,再实现Application_AuthenticateRequest函数,最后Compile 、run,发现运行效果和在vs.net2003中的效果一样,hoho。真是一个大的发现。
不过,想想,我自己也没有搞懂,为什么在vs.net2005中要把这些函数不创建出来?只能在网上再找找有关这方面的介绍吧。
上面我还没写一不,就是如何设置web.config文件,这个在网上有很多这方面的例子,有空大家可以找一找,看看,在这我主要说明的是vs.net2005中实现窗体验证存在的问题,所以这方面的内容就不过多说明了。
也鉴于个人语文水平有限,不足之处,还望大家多多指教,在这先谢过大家了,hoho