在vs.net 2005 手动实现 窗体认证 的问题

在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信息提出,处理。

protected   void  Application_AuthenticateRequest(Object sender, EventArgs e)
    
{
        
// 提取窗体身份验证 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值