ASP.net 完整登录流程
登录流程

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MyProject.IBLL;
using MyProject.BLL;
using MyProject.Common;
using System.Drawing;
using System.IO; namespace MyProject.Controllers
{
public class LoginController : Controller
{
//
// GET: /Login/
IUserInfoService userInfoService = new UserInfoService();
//展示登录页面
public ActionResult Index()
{
if (CheckCookieInfo()) {
return Redirect("/UserInfo/Index");
}
return View();
} private bool CheckCookieInfo()
{
bool flag = false;
if (Request.Cookies["cp1"] != null && Request.Cookies["cp2"] != null)
{
//获取浏览器传递过来的Cookie值
string username = Request.Cookies["cp1"].Value;
string psd = Request.Cookies["cp2"].Value;
string msg;
if (userInfoService.CheckUser(username, psd, out msg))
{
//设置登录标识
Session["username"] = username;
flag = true;
}
else
{
//验证失败清空无效Cookie
Response.Cookies["cp1"].Expires = DateTime.Now.AddDays(-);
Response.Cookies["cp2"].Expires = DateTime.Now.AddDays(-);
}
}
return flag;
}
//获取验证码
public ActionResult CreateCode() {
YZMHelper yzm = new YZMHelper();
Session["vCode"] = yzm.Text;
MemoryStream ms = new MemoryStream();
yzm.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] bytes = ms.ToArray();
ms.Close();
return File(bytes, "Image/JPEG");
}
//检查用户名是否存在
public ActionResult ChechUserName(string username) {
if (userInfoService.LoadEntity(u => u.UserName == username).FirstOrDefault() != null)
{
return Json(new { res = }, JsonRequestBehavior.AllowGet);
}
else {
return Json(new { res = }, JsonRequestBehavior.AllowGet);
}
}
//登录校验
public ActionResult CkeckUser() {
string username = Request["UserName"];
string psd = Request["UserPwd"];
string vcode = Request["vCode"];
bool remmberFlag = Request["remmber"]==""?true:false;
if (vcode.Equals(Session["vCode"].ToString(), StringComparison.CurrentCultureIgnoreCase))
{
//清空保存验证码Session
Session["vCode"] = null;
string msg;
if (userInfoService.CheckUser(username, psd, out msg))
{
Session["username"] = username;
if (remmberFlag) {
//设置Cokkie信息
HttpCookie cookie1 = new HttpCookie("cp1", username);
//密码最好使用MD5加密
HttpCookie cookie2 = new HttpCookie("cp2", psd);
//设置过期时间
cookie1.Expires = DateTime.Now.AddDays();
cookie2.Expires = DateTime.Now.AddDays();
Response.Cookies.Add(cookie1);
Response.Cookies.Add(cookie2);
}
return Json(new { res = , msg = "/UserInfo/Index" });
}
else
{
//清空保存验证码Session,
Session["vCode"] = null;
return Json(new { res = , msg = msg });
}
}
else {
return Json(new { res = });
}
}
}
}
这种方法仅限于资源全储存于一台服务器上,如网站分布在多台服务器上,则需要单独将登录标识储存于数据库,然后给浏览器返回一个随机序列号作为SessionID,浏览器下次访问时会携带这个SessionId,然后从数据库(Memcache缓存)中查找,根据查找结果判断用户是否已经登录
这是实现服务器端分布式的必要的操作
string sessionId =Guid.NewGuid().ToString();
//作为Memcache的key
Common.MemcacheHelper.Set(sessionId,username( 登录标识,可以随意设置 ), DateTime.Now.AddMinutes());
//使用Memcache代替Session解决数据在不同Web服务器之间共享的问题。
Response.Cookies["sessionId"].Value = sessionId;
//将Memcache的key以cookie的形式返回到浏览器端的内存中,当用户再次请求其它的页面请求报文中会以Cookie将该值再次发送服务端。
接下来会介绍关于怎么用Memcache储存登录标识
ASP.net 完整登录流程的更多相关文章
- 本页面用来演示如何通过JS SDK,创建完整的QQ登录流程,并调用openapi接口
QQ登录将用户信息存储在cookie中,命名为__qc__k ,请不要占用 __qc__k : 1) :: 在页面顶部引入JS SDK库: 将“js?”后面的appid参数(示例代码中的:100229 ...
- 利用Div+CSS(嵌套+盒模型)布局页面完整实例流程
Div+CSS(嵌套+盒模型)布局页面完整实例流程: <!DOCTYPE html><html> <head> <meta charset="UT ...
- ASP.Net请求处理机制初步探索之旅 - Part 5 ASP.Net MVC请求处理流程
好听的歌 我一直觉得看一篇文章再听一首好听的歌,真是种享受.于是,我在这里嵌入一首好听的歌,当然你觉得不想听的话可以点击停止,歌曲 from 王菲 <梦中人>: --> 开篇:上一篇 ...
- ASP.Net MVC请求处理流程
ASP.Net MVC请求处理流程 好听的歌 我一直觉得看一篇文章再听一首好听的歌,真是种享受.于是,我在这里嵌入一首好听的歌,当然你觉得不想听的话可以点击停止,歌曲 from 王菲 <梦中人& ...
- python全栈开发day60-django_app ORM 完整登录案例
day60 内容回顾: 1. HTTP协议: 1.请求(浏览器发给服务端的消息——request) 请求方法 URL 协议版本\r\n k1:v1\r\n k2:v2\r\n \r\n 请求体 —— ...
- ASP.NET Forms 认证流程
ASP.NET Forms 认证 Forms认证基础 HTTP是无状态的协议,也就是说用户的每次请求对服务器来说都是一次全新的请求,服务器不能识别这个请求是哪个用户发送的. 那服务器如何去判断一个用户 ...
- ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 登录登出 上一章节我们总算完善了注册的功能,而且也添加了一个用户,现 ...
- SCP免密传输和SSH登录流程详解
SCP免密传输和SSH登录协议详解 在linux下开发时,经常需要登录到其他的设备上,例如虚拟机内ubuntu.树莓派等等,经常涉及到传输文件的操作,传输文件有很多中方法,如物理磁盘拷贝,基于网络的s ...
- MVC5+EF6 入门完整教程3 :EF完整开发流程
https://www.cnblogs.com/miro/p/4053473.html 学完本篇文章,你将会掌握基于EF数据模型的完整开发流程. 本次将会完成EF数据模型的搭建和使用. 基于这个模型, ...
随机推荐
- Linux Docker安装Jenkins
安装环境 操作系统 centos7.3 安装Docker,安装及配置见 <Docker之Docker介绍及安装配置> 安装Jenkins 下载Jenkins 命令:sudo docker ...
- eclipse基于git上传项目到码云上
此文章只讲如何把项目上传到码云上面,前提是你的项目已经用git创建好了. 关于如何用git创建项目,请读者见我博客的另一篇文章. 继续:右键点击ssm [ssm master]项目-->选择Te ...
- pyqt4 利用信号槽在子线程里面操作Qt界面
转载:ABigCaiBird #-*- coding:utf-8 -*- ####### from PyQt4.QtCore import * from PyQt4.QtGui import * im ...
- 云中树莓派(5):利用 AWS IoT Greengrass 进行 IoT 边缘计算
云中树莓派(1):环境准备 云中树莓派(2):将传感器数据上传到AWS IoT 并利用Kibana进行展示 云中树莓派(3):通过 AWS IoT 控制树莓派上的Led 云中树莓派(4):利用声音传感 ...
- Java中的Future相关
先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材.网上购买厨具比较方便,食材去超市买更放心. 实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材.所以,在主线程里面另起一个子线 ...
- Map相关问题
<!--加载地图开始--> <!DOCTYPE html><html><head> <meta charset="UTF-8" ...
- linux下打开文件、编辑文本cat\gedit\nano
cat: 文本编辑器:gedit.nano,要获得根权限,在前面加上sudo
- 关于Vue实例的生命周期created和mounted的区别
什么是生命周期 Vue实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom.渲染→更新→渲染.卸载等一系列过程,我们称这是Vue的生命周期.通俗说就是Vue实例从创建到销毁的过 ...
- 安装配置Glusterfs
软件下载地址:http://bits.gluster.org/pub/gluster/glusterfs/3.4.2/x86_64/ 192.168.1.11 10.1.1.241 glusterfs ...
- implementation compile的区别
implementation不可以依赖传递:依赖对app Module 是不可见的 compile可以依赖传递:依赖对app Module 是可见的 AndroidStudio升级到3.0以上后,第一 ...