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数据模型的搭建和使用. 基于这个模型, ...
随机推荐
- 测试教程网.unittest教程.1. 基本概念
From:http://www.testclass.net/pyunit/basic_concept/ unittest是python自带的单元测试框架,有时候又被称为”PyUnit”,是python ...
- C++进阶--析构函数中的异常
//############################################################################ /* * 不要让异常离开析构函数 * 析构 ...
- Espresso小试
Espresso开源了,那就试着用一下, 1. 下载Espresso Espresso没有提供单独的jar包下载,建议clone整个项目或者下载zip包 git clone https://code. ...
- pyqt5.8.2没有qt Designer和assistant exe
使用python3.6 pyqt5.8 eric6 创建完新的窗体后,弹出如下的错误: 解决方法: 1.安装pyqt5-tools 下载地址: https://pypi.python.org/pypi ...
- CSS3 圆角(border-radius)
值:半径的长度 前缀 -moz(例如 -moz-border-radius)用于Firefox -webkit(例如:-webkit-border-radius)用于Safari和Chrome. 例1 ...
- 阿里云ECS专有网络下安装flannel注意事项
参照文章http://www.cnblogs.com/lyzw/p/6016789.html在两台阿里云ECS主机安装与配置flannel,在专有网络下两台主机只能通过公网ip连通,所以flannel ...
- JDK类集框架实验(ArrayList,LinkedList,TreeSet,HashSet,TreeMap,HashMap)
ArrayList import java.util.ArrayList; public class C8_3 { public static void main(String[] args) ...
- 廖雪峰Java5集合-3Map-1使用Map
廖雪峰的视频不全,以下是疯狂Java关于Map的讲解 1.Map定义 Map是一种键值映射表,可以通过key快速查找value,同python的dict.key不允许重复,value可以重复. Map ...
- checked和stop()的讲解
input:cheacked (属性选择器): checked 选中复选框 $("p").stop(ture); 代码的翻译:(参数)布尔值 p身上所有的动画都停止了 加不加tr ...
- [UE4]InterpToMovement
InterpToMovement:可以让Actor在规定时间内,在多个点之间循环移动. Duration:规定时间