`
冷寒冰
  • 浏览: 251751 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C#.net cookie、session实现自动登陆

 
阅读更多

C#.net cookie、session实现自动登陆

一、什么是用户自动登录?

对于我们的网站向已注册用户提供某些专门的服务,比如网上购物、在线下载、收费浏览等等,就会要求用户在使用这些服务之前进入登录页面,输入用户名和密 码,并进行验证。

如果用户经常访问我们的网站,假如每天都访问一次,或者好几次,那么用户每次都重复这些登录操作就会感到相当厌烦。通过一些简单的技术手段,我们可以让网 站“记住”那些在曾经登录过的用户。当该用户下次再来访问的时候,网站可以识别该用户,并为其自动完成登录过程。

二、基本思路

作为网站的编写者,我们无从知道坐在电脑前的那个人是谁。我们能够知道的是,访问网站的是哪一台电脑——这一点可以通过Cookie实现。因此,对用户的 识别实际上就是对客户端电脑的识别。

简单的说,当用户第一次登录网站的时候,网站向客户端发送一个包含有用户名的Cookie。当用户在之后的某个时候再次访问,浏览器就会向网站服 务器回送这个Cookie,于是,我们可以从这个Cookie中读取到用户名,然后调用登录的方法,从而实现自动为用户登录。

三、防止欺骗

Cookie只是一个普通的文本文件,那里面包含的字符串可以直接用记事本打开并进行编辑。因此任何人在任何电脑上都可以伪造一个包含有他人用户名 的 Cookie,从而实现对他人身份的冒用。要解决这个问题,就要在Cookie中附加一项信息,这个信息需要具有以下特性:1、和该用户一一对应;2、伪 造难度大。这些内容和用户名一起,以Cookie的形式发送给用户的浏览器。并且,服务器必须能够记住这项内容,以便用户再次访问的时候进行核对。

理论上,可以使用该用户的密码。密码具备了前述的两个特点。但是因为Cookie本身未经加密,保存于其中的密码(应该加密)可以被任何人看到,因此这个 方法极不安全。

另一种可以加以利用的信息是用户访问时的Session id。因为Session id是一个由系统随机产生的、无规律的、长度较长的字符串,因此它很难被伪造。要把它和用户对应起来,我们需要在数据库中添加一个表,这个表至少有两个字 段,一个是用户名,一个是Session id。当用户首次登录的时候,我们把当前的Session id和用户名分别用Cookie发送给用户,同时,把这两项作为一条记录插入数据库。这样,当用户再次访问的时候,服务器就可以读取客户端发来的这两个 Cookie,并且用它们的值和数据库中的记录比对。如果在数据库中找到了相应记录,就说明这台电脑的确是该用户上次登录时使用的电脑,进而可以为该用户 自动登录。

四、实现

1、在登录页面中添加一个复选框,让用户选择是否愿意在一定时间内实现自动登陆,例如两周。

代码:
<input type="checkbox" name="autologin">两周内自动登录

2、在负责处理登录过程的Servlet中,判断用户是否选择了该复选框。如果是,则执行这两个操作:向用户发送两个Cookie,以及向数据库写 入一条相应的记录。

代码:

Cookie ckUsername, ckSessionid;

if (autologin.equals("on")) {
// 如果用户选择了“两周内自动登录”,则向用户发送两个cookie。
// 一个cookie记录用户名,另一个记录唯一的验证码,
// 并将此验证码写入数据库,以备用户返回时查询。(防止伪造cookie)
ckUsername = new Cookie("autoLoginUser", user.getUsername()); // user是代表用户的bean
ckUsername.setMaxAge(60 * 60 * 24 * 14); //设置Cookie有效期为14天
res.addCookie(ckUsername);

sessionid = session.getId(); // 取得当前的session id
ckSessionid = new Cookie("sessionid", sessionid);
ckSessionid.setMaxAge(60 * 60 * 24 * 14);
res.addCookie(ckSessionid);

// 在数据库中插入相应记录
userSessionDAO.insertUserSession(user, sessionid);
}

3、实现自动登录。因为用户下次访问的时候,可能直接访问网站的任何页面(例如通过收藏夹),而不一定是首页或者登录页面,所以我们需要用 Filter拦截到达该网站的所有请求,并执行自动登录。

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession(true);
String username;
String sessionid; // 此sessionid是上次用户登录时保存于用户端的识别码,用于用户后续访问的自动登录。不是本次访问的session id。
Cookie[] cookies;
CookieManager cm = new CookieManager(); // CookieManager是一个自定义的类,用于从Cookie数组中查找并返回指定名称的Cookie值。
boolean isAutoLogin;

// 如果session中没有user对象,则创建一个。
User user = (User) session.getAttribute("user");
if (user == null) {
user = new User(); // 此时user中的username属性为"",表示用户未登录。
}

// 如果user对象的username为"",表示用户未登录。则执行自动登录过程。
// 否则不自动登录。
if (user.getUsername().equals("")) {
// 检查用户浏览器是否发送了上次登录的用户名和sessionid,
// 如果是,则为用户自动登陆。
cookies = request.getCookies();
username = cm.getCookieValue(cookies, "autoLoginUser");
sessionid = cm.getCookieValue(cookies, "sessionid");
isAutoLogin = userSessionDAO.getAutoLoginState(username, sessionid); // 如果在数据库中找到了相应记录,则说明可以自动登录。

if (isAutoLogin) {
user.setUsername(username);
user.setNickname(DBUtil.getNickName(username));
session.setAttribute("user", user); // 将user bean添加到session中。
}
}
chain.doFilter(req, resp);
}

4、注销。只有当用户在上次访问时,未经注销就离开网站,我们才能在该用户下次访问时执行自动登录。如果用户显式的执行了注销操作,那就表示该用户 不希望我们记住他。我们需要在执行注销操作的Servlet中,从数据库中删除相应记录。这样,下次用户访问的时候就不会执行自动登录了。

五、改进

用户可能为了方便,自行修改Cookie中的有效期,从而达到长期自动登录的目的。对某些存有敏感信息的网站来说,这样做并不安全。当用户长时间没 有使用他的电脑,或者将电脑遗弃、转让了,而保存于其中的Cookie仍然是有效的,这就为用户和网站带来潜在的风险。

要解决这个问题,我们可以在数据库中增加一个字段,用以记录自动登录的过期日。这样,是否执行自动登录就不再以客户端的Cookie有效期为准,而 是以服务器端数据库中的信息为准。当我们想要调整用户自动登录的有效期的时候,只需要修改数据库中相应的日期字段即可,因而这一过程变得更加安全。

分享到:
评论

相关推荐

    .net C# 利用session控制用户重复登录及统计在线用户数解决方案

    总结来说,`.NET C# 利用session控制用户重复登录及统计在线用户数解决方案`主要是: 1. 用户登录时,将用户信息存入`Session`,同时设置登录状态和计数器。 2. 检查`Session`中的登录状态以防止重复登录。 3. 使用...

    c#实现cookie和session的登陆实例

    在Web开发中,Cookie和Session是两种常见的用户身份验证机制,尤其在C#编程语言中,它们被广泛用于实现登录功能。本实例将探讨如何在C#环境下利用Cookie和Session来处理用户登录状态。 首先,我们要理解Cookie和...

    asp.net-c#写的一个cookie和session登陆小实验

    之后,用户访问其他页面时,系统可以通过检查Cookie或Session中的信息来判断用户是否已登录,从而实现登录状态的保持。 文件"web_login2_20120510"可能是一个包含此登录系统的Web应用程序项目文件,可能包括.aspx...

    c#.net配置Session的生命周期.rar(视频)

    本教程将深入探讨如何在C#.NET环境中配置Session的生命周期,以及它对应用程序性能和用户体验的影响。 首先,Session的基本概念:Session是服务器端存储用户特定信息的一种方式。当用户访问网站时,服务器为每个...

    C#.NET的SSO单点登录WebAuth部分

    在C#.NET环境中实现SSO,WebAuth是一个关键组件,通常涉及ASP.NET的身份验证服务、Cookie管理和跨域认证。下面将详细介绍C#.NET中SSO单点登录WebAuth部分的相关知识点。 1. ASP.NET身份验证基础:在ASP.NET中,主要...

    asp.net 购物车 C# session实现

    当用户首次访问网站时,ASP.NET会为该用户分配一个唯一的ID(Session ID),并将这个ID存储在用户的Cookie中。后续请求中,服务器通过这个ID找到相应的Session数据,从而保持用户状态。 在这个购物车实现中,我们...

    C#.net实现单点登录

    - `MasterSite`检查令牌的有效性,如果验证通过,会告知子站点用户已授权,从而实现登录状态的共享。 2. **ASP.NET实现SSO的关键技术**: - **Cookie**:通常情况下,令牌会存储在HTTP Cookie中,由浏览器自动...

    利用cookie实现asp.net(c#)验证码

    在ASP.NET(C#)开发中,验证码是一种常用的安全机制,用于防止自动脚本或机器人进行恶意操作,如垃圾邮件提交、刷票等。Cookie是Web应用程序中存储在客户端的一种小型数据容器,通常用来保存用户的会话信息。在这个...

    c#.net登陆实例

    这个“c#.net登陆实例”旨在提供一个基础的登录系统教学,帮助开发者理解如何利用C#语言和.NET框架来实现用户验证。下面我们将深入探讨这个实例中的关键知识点。 1. **C#基础知识**: - **变量与数据类型**:在...

    asp.net c# 在类中使用session的方法

    在Web应用程序开发中,特别是在ASP.NET C#应用中,正确且有效地在类中使用Session是非常重要的,这能帮助我们实现用户个性化体验、购物车管理、登录状态维护等功能。 ### 一、理解ASP.NET中的Session Session对象...

    Visual C#.NET网络编程

    书中可能会介绍如何使用C#.NET创建HTTP客户端和服务器,利用HttpClient类进行HTTP请求和响应,以及如何处理Cookie、Session等状态管理。 此外,WebSocket协议的出现为实时通信提供了新的可能。书中可能涉及了...

    Beginning ASP.NET 1.1 with Visual C# .NET 2003

    《 Beginning ASP.NET 1.1 with Visual C# .NET 2003》是一本针对初学者的ASP.NET编程指南,旨在帮助读者掌握使用Visual C# .NET 2003开发ASP.NET 1.1应用程序的基础知识。这本书的源代码包含在提供的压缩包中,其中...

    ASP.NET 1.1入门经典—— Visual C#.NET 2003编程篇.rar

    3. **状态管理**:ASP.NET提供了多种状态管理技术,如视图状态、隐藏字段、Session、Cookie等,以保持用户会话中的信息,确保跨页面数据的一致性。 4. **C#编程基础**:C#是一种面向对象的编程语言,具有类型安全、...

    Ajax C#.NET simple chat

    【Ajax C#.NET 简单聊天室】是一个适合初学者入门的项目,它利用了Ajax技术以及C#.NET编程语言来实现一个实时交互的在线聊天功能。在本项目中,我们将探讨以下几个关键知识点: 1. **Ajax(异步JavaScript和XML)**...

    C#.net在线调查投票系统

    ASP.NET提供了Session、ViewState和Cookie等方式来保持用户状态。 9. **安全性**:系统可能采用了防止SQL注入、XSS攻击等的安全措施,以保护用户数据和系统安全。 10. **异常处理**:良好的异常处理机制确保在遇到...

    C# ASP.NET 模块 - 聊天室模块

    登录时,系统会校验用户提供的凭证,如果匹配,则创建一个Session或Cookie来保持登录状态。 用户聊天功能是聊天室的核心。C# ASP.NET可以利用AJAX技术实现实时通信,使用户无需刷新页面即可发送和接收消息。AJAX...

    asp.net 的Session数据库存储方式

    在ASP.NET中,Session是一种用于跨页面请求保持用户状态的技术,它允许开发人员在服务器端存储用户特定的信息。然而,默认情况下,Session数据是存储在内存中的,这可能会导致一些问题,比如当应用程序需要处理大量...

    学校网站原代码(C#.NET)

    通过这个项目,开发者可以深入理解C#.NET在Web开发中的实际应用,同时学习如何设计和实现一个基于ACCESS数据库的后台系统。对于初学者,这是一个很好的实践案例,可以帮助他们巩固理论知识并提高实际开发技能。对于...

    基于c#实现cookie和session的登陆技术

    本文将深入探讨如何在C#环境中,特别是在Visual Studio 2005环境下,利用Cookie和Session这两种常见的用户状态管理机制来实现登录功能。这两种技术都是Web开发中的核心概念,对于构建安全、高效的应用至关重要。 ...

    Visual C#.NET网络核心编程

    5. **异步编程**:C#.NET提供的异步编程模型,如async/await关键字,用于在网络编程中实现非阻塞操作,提高程序的性能和用户体验。 6. **网络安全**:涵盖SSL/TLS加密,证书验证,以及如何在C#.NET中安全地处理网络...

Global site tag (gtag.js) - Google Analytics