asp.net验证

 从上图中可以看出,浏览器地址栏中,AdminLogin.aspx后有参数ReturnUrl,而ReturnUrl的值跳转之间访问的Default.aspx网页。

    在上图所示页面中,用户可以输入用户名和密码,然后单击登录按钮提交信息。在后台,服务器接收到用户提交的信息后,可以判断用户提交的用户和密码是否匹配,如果匹配,则认为身份验证通过。这个时候,进入了《asp.net中的窗体身份验证(完整篇之二:asp.net的窗体身份验证过程) 》中的第6步,也就是“创建一个包含窗体身份验证票的Cookie”。

    所谓“创建一个包含窗体身份验证票的Cookie”,事实上是分两步走,第一步是创建一个窗体身份验证票,第二步是将身份验证票放在Cookie中。不过呢,在asp.net中,可以简化这个过程。

    方式一:使用默认的身份验证票。这个时候单击登录按钮的代码如下所示:

 view plaincopy to clipboardprint?
protected void Button1_Click(object sender, EventArgs e)  
{  
    Label1.Text = "";  
 
    //当用户名为1,密码为2时,身份验证通过  
    if (TextBox1.Text == "1" && TextBox2.Text == "2")  
    {  
        //方式一:使用默认的身份验证票,并跳转到初始请求的页面或默认页面  
        FormsAuthentication.RedirectFromLoginPage("yundao", false);  
    }  
    else 
    {  
        Label1.Text = "用户名为1,密码为2,请重新输入";  
    }  

protected void Button1_Click(object sender, EventArgs e)
{
    Label1.Text = "";

    //当用户名为1,密码为2时,身份验证通过
    if (TextBox1.Text == "1" && TextBox2.Text == "2")
    {
        //方式一:使用默认的身份验证票,并跳转到初始请求的页面或默认页面
        FormsAuthentication.RedirectFromLoginPage("yundao", false);
    }
    else
    {
        Label1.Text = "用户名为1,密码为2,请重新输入";
    }
}

    在以上代码中,为了方便起见,只要用户输入的用户名为1,密码为2,则认为身份验证通过。身份验证之后,接下来的三个动作应该是:

创建身份验证票;
将身份验证票放在Cookie中;
跳转到登录前的网页或默认网页。
    在asp.net中,使用FormsAuthentication类来操作Forms身份验证,该类中有一个RedirectFromLoginPage()方法,该方法可以一次性完成以上三个步骤:

创建一个默认的身份验证票。
将该默认的身份验证票存放在默认的Cookie中。此时,用于存放身份验证票的Cookie名由web.config文件中的<forms>节点的name属性值决定,如果没有设置该属性,默认情况下,Cookie名为“.ASPXAUTH”。
跳转网页。跳转网页的地址由登录页面的URL中的ReturnUrl参数决定,如上图所示,登录后将跳转到default.aspx页面。如果登录页面的URL中没有ReturnUrl参数(也就是说,直接访问的登录页面),那么将会跳转到web.config文件中的<forms>节点的defaultUrl属性值所指定的页面,如果没有设置该属性,默认情况下为default.aspx页面。
    RedirectFromLoginPage()方法中第一个参数为经过身份验证的用户名,这个用户名可以与用户的登录名相同,也可以不相同。第二个参数为是否创建永久的Cookie。通常为了安全起见,都不会创建永久的Cookie,因此该参数值通常为false。但如果创建的非永久的Cookie,那么在关闭浏览器窗口之后,再进入网站,就需要重新进行身份验证,而创建永久的Cookie,只要身份验证过之后,无论再打开该网站中的什么网页,都不会要求再一次登录。

    本例源代码可以在http://www.aspxfans.com/myBlogFile/20090528123020.rar中下载。

    以上方式是最简单的窗体身份验证方式,因为使用的是默认的身份验证票,但以上代码有一个缺点,就是身份验证通过后,要么跳转到登录页面前的网页,要么跳转到默认网页。如果想停留在当前网页,RedirectFromLoginPage()方法就无能为力了,在这种情况下,可以使用FormsAuthentication类的SetAuthCookie()方法,该方法的作用只是创建一个默认的身份验证票并将其写入Cookie中,但不跳转网页。如果要跳转网页的话,可以判断ReturnUrl参数值是否为空,再决定是否跳转网页。如以下代码所示:

view plaincopy to clipboardprint?
protected void Button1_Click(object sender, EventArgs e)  
{  
    Label1.Text = "";  
 
    //当用户名为1,密码为2时,身份验证通过  
    if (TextBox1.Text == "1" && TextBox2.Text == "2")  
    {  
        //方式二:使用默认的身份验证票,并写入Cookie  
        FormsAuthentication.SetAuthCookie("yundao", false);  
        //判断初始请求页是否为空  
        if (string.IsNullOrEmpty(Request.QueryString["ReturnUrl"]))  
        {  
            Label1.Text = "登录成功,请选择以下网页:";  
        }  
        else 
        {  
            Response.Redirect(Request.QueryString["ReturnUrl"].Trim());  
        }  
    }  
    else 
    {  
        Label1.Text = "用户名为1,密码为2,请重新输入";  
    }  

protected void Button1_Click(object sender, EventArgs e)
{
    Label1.Text = "";

    //当用户名为1,密码为2时,身份验证通过
    if (TextBox1.Text == "1" && TextBox2.Text == "2")
    {
        //方式二:使用默认的身份验证票,并写入Cookie
        FormsAuthentication.SetAuthCookie("yundao", false);
        //判断初始请求页是否为空
        if (string.IsNullOrEmpty(Request.QueryString["ReturnUrl"]))
        {
            Label1.Text = "登录成功,请选择以下网页:";
        }
        else
        {
            Response.Redirect(Request.QueryString["ReturnUrl"].Trim());
        }
    }
    else
    {
        Label1.Text = "用户名为1,密码为2,请重新输入";
    }
}

    从以上代码可以看出,SetAuthCookie()方法与RedirectFromLoginPage()方法相比,缺少了跳转的步骤。因此,可以更加灵活地掌握用户跳转的页面。SetAuthCookie()方法的第一个参数也是经过身份验证的用户名,第二个参数也是是否创建永久的Cookie

    本例的源代码可以在http://www.aspxfans.com/myBlogFile/20090528125836.rar下载。

    事实上,FormsAuthentication类还有一个GetRedirectUrl()方法,该方法可以返回初始请求页或默认页面,使用该方法也可以跳转页面。如以下代码所示:

view plaincopy to clipboardprint?
protected void Button1_Click(object sender, EventArgs e)  
{  
    Label1.Text = "";  
 
    //当用户名为1,密码为2时,身份验证通过  
    if (TextBox1.Text == "1" && TextBox2.Text == "2")  
    {  
        //方式三:使用默认的身份验证票,并写入Cookie  
        FormsAuthentication.SetAuthCookie("yundao", false);  
        //跳转到初始请求页或默认页面  
        Response.Redirect(FormsAuthentication.GetRedirectUrl("yundao",false));  
    }  
    else 
    {  
        Label1.Text = "用户名为1,密码为2,请重新输入";  
    }  

protected void Button1_Click(object sender, EventArgs e)
{
    Label1.Text = "";

    //当用户名为1,密码为2时,身份验证通过
    if (TextBox1.Text == "1" && TextBox2.Text == "2")
    {
        //方式三:使用默认的身份验证票,并写入Cookie
        FormsAuthentication.SetAuthCookie("yundao", false);
        //跳转到初始请求页或默认页面
        Response.Redirect(FormsAuthentication.GetRedirectUrl("yundao",false));
    }
    else
    {
        Label1.Text = "用户名为1,密码为2,请重新输入";
    }
}

    GetRedirectUrl()方法的第一个参数为经过身份验证的用户名,但第二个参数是可以忽略的参数,通常设为false。以上代码与FormsAuthentication.RedirectFromLoginPage("yundao", false)是等价的。

    本例的源代码可以在http://www.aspxfans.com/myBlogFile/20090528130504.rar下载。

    前面介绍了三种窗体身份验证的方法,这三种方法中都使用了默认的身份验证票,而默认的身份验证票中只能传递经过验证的用户名,而不能传递其他数据。如果一个网站中,对不同的身份的用户给予不同的权限,那么以上三种方法都不适用了。由于要传递其他数据,所以必须要使用自定义的身份验证票,如以下代码所示:

view plaincopy to clipboardprint?
protected void Button1_Click(object sender, EventArgs e)  
{  
    Label1.Text = "";  
 
    //当用户名为1,密码为2时,身份验证通过  
    if (TextBox1.Text == "1" && TextBox2.Text == "2")  
    {  
        //方式四:创建自定义身份验证票  
        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, "yundao", DateTime.Now, DateTime.Now.AddMinutes(30), false, "admin");  
        //将身份验证票加密  
        string EncrTicket = FormsAuthentication.Encrypt(ticket);  
        //创建一个Cookie  
        HttpCookie myCookie = new HttpCookie(FormsAuthentication.FormsCookieName, EncrTicket);  
        //将Cookie写入客户端  
        Response.Cookies.Add(myCookie);  
        //跳转到初始请求页或默认页面  
        Response.Redirect(FormsAuthentication.GetRedirectUrl("yundao",false));  
    }  
    else 
    {  
        Label1.Text = "用户名为1,密码为2,请重新输入";  
    }  

protected void Button1_Click(object sender, EventArgs e)
{
    Label1.Text = "";

    //当用户名为1,密码为2时,身份验证通过
    if (TextBox1.Text == "1" && TextBox2.Text == "2")
    {
        //方式四:创建自定义身份验证票
        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, "yundao", DateTime.Now, DateTime.Now.AddMinutes(30), false, "admin");
        //将身份验证票加密
        string EncrTicket = FormsAuthentication.Encrypt(ticket);
        //创建一个Cookie
        HttpCookie myCookie = new HttpCookie(FormsAuthentication.FormsCookieName, EncrTicket);
        //将Cookie写入客户端
        Response.Cookies.Add(myCookie);
        //跳转到初始请求页或默认页面
        Response.Redirect(FormsAuthentication.GetRedirectUrl("yundao",false));
    }
    else
    {
        Label1.Text = "用户名为1,密码为2,请重新输入";
    }
}

    在以上代码中,首先,使用new FormsAuthenticationTicket()语句创建了一个身份验证票,FormsAuthenticationTicket()的第一个参数为身份验证票的版本号,通常为1;第二个参数为经过验证的用户名;第三个参数为票证发出时的本地时间;第四个参数为票证过期时的本地时间;第五个参数为是否创建永久的Cookie;第六个参数,也就是最重要的参数,为要传递的用户数据。如果不需要传递用户数据,可以设为null。但本人建议使用空字符串,否则为票证加密时可能会产生意想不到的问题。

    创建完身份验证票之后,可以使用FormsAuthentication类的Encrypt()方法为身份验证票加密,加密后返回一个字符串。

    然后创建一个Cookie,FormsAuthentication.FormsCookieName属性可以返回存放身份验证票的Cookie名,也就是web.config中<Forms>小节的name属性值。当然,在这里还可以设置一些Cookie相关的属性,如Cookie的path、expires、domain等,这此就不多介绍了。

    最后,将Cookie写入到客户端。

    这样,一个完整的身份验证就完成了,最后还可以选择是否跳转页面。

    本例的源代码可以在http://www.aspxfans.com/myBlogFile/20090528133151.rar下载。本例的优点是可以传递用户数据,但在传递用户数据时,必须要注册,每个Cookie的大小不能超过4KB,所以传递用户的数据不能太大。

    以上四个例子在vs2005中测试通过。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/smallfools/archive/2009/05/28/4222155.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值