VS2003中实现身份验证的探索经验
转载请注明出处!!
这几天正在弄ASP.NET, 小试了一下身份验证的实现方法, 在这分享一下.,菜鸟的文章,高手可以略过。
首先,看看基于Forms的验证方式。通过测试,我发现这个验证方式是基于整个WEB应用程序的,也就是基于某个虚拟目录的,一旦通过验证可以访问对应的整个虚拟目录下的所有网页,否则会跳转到默认登陆页面。知道了这个原理,我们就知道这样只能实现目录访问控制,无法实现不同用户访问不同的网页。
这里不涉及数据库读取用户的操作,自己虚拟几个默认用户。
这里先实现虚拟目录访问控制。(这部分MSDN有详细的论述,我也是参考MSDN的)
在 Web.config 文件中配置安全设置
应用程序必须被配置成使用基于窗体的身份验证,将 <authentication> 设置为 Forms 并且拒绝匿名用户访问。下面的示例说明如何在所需应用程序的 Web.config 文件中完成此配置:
1. | 插入 <Forms> 标记,并填入相应的属性。(有关这些属性的更多信息,请参考 MSDN 文档或快速入门文档,这些文档在 参考 一节中列出。)复制以下代码,然后在“编辑”菜单中单击“粘贴为 HTML”,将该代码粘贴到文件的 <authentication> 部分:
|
2. | 在 <authorization> 部分中拒绝匿名用户的访问(如下所示):
|
验证了凭据后,应用程序调用下列内容:
FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked); | |||
C# |
这将用户重定向回当初请求的 URL。不想执行重定向的应用程序可以或者调用 FormsAuthentication.GetAuthCookie 来检索 Cookie 值,或者调用 FormsAuthentication.SetAuthCookie 将正确加密的 Cookie 附加到输出的响应中。对于提供嵌入在包含页中的登录 UI 的应用程序,或者想要更多地控制用户被重定向到的位置的应用程序而言,这些方法很有用。身份验证 Cookie 既可以临时又可以永久(“持久”)。临时 Cookie 只在当前浏览器会话期间保持。当浏览器关闭时,临时 Cookie 随即丢失。永久 Cookie 则被浏览器保存,并在浏览器会话间回发,直到被用户显式删除。
注销方法:
FormsAuthentication.SignOut();
Response.Redirect("login.aspx");
这样就完成了一个访问控制的应用程序。
接下来我要实现不同的用户跳转到不同的页面。
首先,要在登陆时创建cookies,然后在用户页面认证cookies是否存在,存在则可以访问否则跳转到登陆页面。这样可以不用基于FORMS的验证。
点击登陆按钮的事件代码:
private void Button1_Click(object sender, System.EventArgs e)
{
if(UserName.Text=="default" && UserPassword.Text=="default")
{//判断用户
HttpCookie mycookie2=new HttpCookie("MyTestDefault","MyTestDefault");
if(PersistCookie.Checked)//判断是否保存cookies
mycookie2.Expires = new DateTime(2007,10,1);
mycookie2.Path = FormsAuthentication.FormsCookiePath;
Response.Cookies.Add(mycookie2);
Response.Redirect("default.aspx");
}
else
Label4.Text="用户名或密码无效!";
}
用户页面判断:
private void Page_Load(object sender, System.EventArgs e)
{
if(Request.Cookies["MyTestDefault"]==null)
Response.Redirect("Login.aspx",true);
Label1.Text = "这是另一个登入界面,欢迎你: ";
}
登出:
Response.Cookies["MyTestDefault"].Expires = DateTime.Now.AddYears(-1); //使cookies失效
Response.Redirect("Login.aspx",false);
如果有其它用户,则在登陆页面添加判断语句,并在相应的用户页面添加cookies检测的语句。
这样就实现了不同用户跳转到不同页面了。