需求描述:当用户的账户在另一个浏览器中登录的时候,需要把当前浏览器的登录强制下线。这种需求在业务系统,或付费视频服务网站中比较常见。

这种需求我称之为“单客户端(浏览器)”登录,与单点登录(SSO)有本质的区别,关于SSO的实现方案可以参考我的另外一篇文章:谁都能看懂的单点登录(SSO)实现方式(附源码)

关于这个功能的实现,我分为三个环节:

  1. 用户登录。
  2. 处理用户请求。
  3. 心跳请求,Keep Alive。

用户登录

我们采用Forms Authentication来实现用户的登录,网上有很多的参考资料,我也写过一篇相关的文章:ASP.NET Forms Authentication详解

不过在开始之前,我们需要先定义一张表来存储已登录的用户,表LoginUser的结构如下:

  • UserId:当前登录用户的ID
  • LoginTime:登录时间
  • ClientIP:客户端的IP
  • UserAgent:用户浏览器的UserAgent,通常我们可以认为ClientIP+UserAgent代表一个客户端。
  • LastRequestTime:最后请求时间,在保持心跳的时候用到

这样几个字段基本上能满足我们的需要了,接下来是用户登录的流程图:

处理用户请求

当用户请求网站资源的时候,Forms Authentication 会根据客户端存储的Ticket信息进行认证用户身份,用户身份认证的流程如下:

有了上面的两个流程,已经基本实现了单客户端登录的需求。但是这样有一个弊端,就是只有当用户对网站发出请求之后,客户端才会知道自己有没有被强制退出。为了解决这个问题,我们引入心跳请求。

心跳请求

心跳请求是通过AJAX定时的向服务器发送请求,保证当前session始终有效。

我们这里利用心跳请求,在服务器返回数据中添加是否被强制退出的一个参数,使客户端能够及时的知道自己是否被强制退出。当客户端接到强制退出的信息时,可以通过JavaScript实现提醒、跳转等功能。

心跳请求与普通web请求一样,唯一不同的是当客户端接收到服务器返回信息后,需要判断是需要继续保持心跳,还是结束心跳,并提示用户已被强制退出。

作者:齐飞(youring2@gmail.com

原文链接:http://www.qeefee.com/article/000557

ASP.NET程序单客户端(浏览器)登录的实现方案的更多相关文章

  1. [Asp.Net Core] Blazor Server Side 扩展用途 - 配合CEF来制作客户端浏览器软件

    前言 大家用过微信PC端吧? 这是用浏览器做的. 用过Visual Studio Code吧? 也是用浏览器做的. 听说, 暴雪客户端也包含浏览器核心?? 在客户端启动一个浏览器, 并不是什么难事了. ...

  2. 利用form.submit提交表单导出文件到客户端浏览器, 提示下载!

    本来是想利用ajax提交json数据到服务端, 让服务端生成一个excel文件并提示客户端浏览器下载的. 但是搞了很久发现ajax方式是无法触发浏览器弹出文件下载的. 网上很多的方案都是说利用form ...

  3. ssh - OpenSSH SSH 客户端 (远程登录程序)

    总览 (SYNOPSIS) ssh [-l login_name ] hostname | user@hostname [command ] ssh -words [-afgknqstvxACNTX1 ...

  4. ASP.NET程序开发范例宝典

    在整理资料时发现一些非常有用的资料源码尤其是初学者,大部分是平时用到的知识点,可以参考其实现方法,分享给大家学习,但请不要用于商业用途. 如果对你有用请多多推荐给其他人分享. 点击对应章节标题下载本章 ...

  5. ASP.NET MVC的客户端验证:jQuery的验证

    之前我们一直讨论的Model验证仅限于服务端验证,即在Web服务器根据相应的规则对请求数据实施验证.如果我们能够在客户端(浏览器)对用户输入的数据先进行验证,这样会减少针对服务器请求的频率,从而缓解W ...

  6. ASP.net 实现禁止用户重复登录

    本文先为大家介绍如何利用缓存Cache方便地实现此功能. Cache与Session这二个状态对像的其中有一个不同之处,Cache是一个全局对象,作用的范围是整个应用程序,所有用户:而Session是 ...

  7. 前端开发【第6篇:JavaScript客户端(浏览器)】

    Web浏览器中的JavaScript 客户端JavaScript时间线 1.Web浏览器创建Document对象,并且开始解析web页面,解析HTML元素和它门的文本内容后添加Element对象和Te ...

  8. Postman+Postman interceptor的安装和使用-解决把chrome浏览器登录状态同步到postman进行有依赖的接口测试 Postman 使用方法详解

    Postman+Postman interceptor的安装和使用-解决把chrome浏览器登录状态同步到postman进行有依赖的接口测试   问题引入:做接口测试时,有依赖关系的接口往往不好测试( ...

  9. 优秀ASP.NET程序员修炼之路

    初级的程序员或经验不足的程序员往往只意识到自己的程序是写给计算机的,而不会在意程序其实也是写给人的,或在意得不够.不全面. 写给机器的程序,往往追求的是运行正确.执行效率能满足要求.但程序员的任务仅仅 ...

随机推荐

  1. VBPR: Visual Bayesian Personalized Ranking from Implicit Feedback-AAAI2016 -20160422

    1.Information publication:AAAI2016 2.What 基于BPR模型的改进:在商品喜好偏序对的学习中,将商品图片的视觉信息加入进去,冷启动问题. 3.Dataset Am ...

  2. Hibernate Tools 自动生成hibernate的hbm文件

    本文有待商榷 当我们在新增插件的时候发现会出现duplicate location,意思是所选的anchive所包含的zip路径已经复用,现象如下: 如上图所示黄色标记部分“Duplicate loc ...

  3. javascript生成GUID的代码

    <script type="text/javascript"> var Guid = function(){}; Guid.prototype = { S4:funct ...

  4. Integer与int的种种比较

    package com.lxm.basics; public class IntegerTest { public static void main(String[] args) { Integer ...

  5. 【NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2】游记

    我第一次写游记,,,, 正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪 ...

  6. oracle创建表之前判断表是否存在,如果存在则删除已有表

    Mysql 创建表之前判断表是否存在,如果存在则删除已有表 DROP TABLE IF EXISTS sys_area; CREATE TABLE sys_area ( id int NOT NULL ...

  7. java的执行与加载的过程

    第一.我们编写一个.java源文件: 第二.通过编译器javac.exe把.java源文件编译为.class字节码文件并装入类装载器里: 第三.java虚拟机java.exe把字节码文件解释为各个平台 ...

  8. JS 弹窗到右下角

    <div id="msg_win" style="display: block; top: 490px; visibility: visible; opacity: ...

  9. C# 图片超过指定大小将压缩到指定大小不失真

    using System;using System.Collections.Generic;using System.Drawing;using System.Drawing.Drawing2D;us ...

  10. 算法与数据结构之顺序查找(C语言)

    #include<stdio.h> #include<stdlib.h> //顺序查找基本思想:从线性表的一端开始,逐个检查关键字是否满足给定的条件 int Sequentia ...