// 举个例子:一个网站有用户系统、商家系统、网站后台3个系统
//可以分3个userType, user ,shop , system
//网站后台一般都有角色,如admin,employee
//那么网站的角色就有 user,shop,admin,employee,但是admin和employee在一个客户端是不能同时登陆的,所以他们是同一类用户(system)

使用方法:

1、添加一个类LoginUser.cs 代码如下:

代码:

namespace MVCCommonAuth
{
#region 功能说明
// 举个例子:一个网站有用户系统、商家系统、网站后台3个系统
//可以分3个userType, user ,shop , system
//网站后台一般都有角色,如admin,employee
//那么网站的角色就有 user,shop,admin,employee,但是admin和employee在一个客户端是不能同时登陆的,所以他们是同一类用户(system)
#endregion public enum UserType
{
User,
Shop,
System
} [Serializable]
public class LoginUser
{
private static string DESKEY = DateTime.Now.ToString("1234MMdd");
public int ID { get; set; }
public string UserName { get; set; }
public string Roles { get; set; }
public DateTime Expires { get; set; } public readonly static string CookieNamePrefix = "authcookie"; public void Login(string userType, string domain = null, string path = null)
{
var keyName = CookieNamePrefix + userType;
var json = JsonConvert.SerializeObject(this);
var value = EncryptString(json, DESKEY); HttpCookie cookie = new HttpCookie(keyName, value);
cookie.Expires = Expires;
if (!string.IsNullOrWhiteSpace(domain))
{
cookie.Domain = domain;
}
if (path != null)
{
cookie.Path = path;
}
HttpContext.Current.Items[keyName] = this;
HttpContext.Current.Response.Cookies.Add(cookie);
} /// <summary>
/// 从cookie读取用户信息
/// </summary>
/// <param name="cookieName"></param>
private static LoginUser BuildUser(string keyName)
{
var cookie = HttpContext.Current.Request.Cookies[keyName];
if (cookie != null && !string.IsNullOrEmpty(cookie.Value))
{
try
{
var json = DecryptString(cookie.Value, DESKEY);
var loginuser = JsonConvert.DeserializeObject<LoginUser>(json);
if (loginuser != null)
{
if (loginuser.Expires >= DateTime.Now)
{
return loginuser;
}
}
}
catch
{
//do nothing
}
}
return null;
} public static LoginUser GetUser(string userType)
{
var keyName = CookieNamePrefix + userType;
if (!HttpContext.Current.Items.Contains(keyName))
{
var user = BuildUser(keyName);
HttpContext.Current.Items[keyName] = user;
return user;
}
else
{
return HttpContext.Current.Items[keyName] as LoginUser;
}
} public static int GetUserID(string userType)
{
var user = GetUser(userType);
if (user != null)
return user.ID;
return ;
} /// <summary>
/// 退出cookie登录
/// </summary>
public static void Logout(string userType)
{
var keyName = CookieNamePrefix + userType; HttpCookie cookie = new HttpCookie(keyName, string.Empty);
cookie.Expires = DateTime.Now.AddMonths(-);
HttpContext.Current.Response.Cookies.Add(cookie);
} #region 字符串加密 /// <summary>
/// 利用DES加密算法加密字符串(可解密)
/// </summary>
/// <param name="plaintext">被加密的字符串</param>
/// <param name="key">密钥(只支持8个字节的密钥)</param>
/// <returns>加密后的字符串</returns>
private static string EncryptString(string plaintext, string key)
{
//访问数据加密标准(DES)算法的加密服务提供程序 (CSP) 版本的包装对象
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Key = ASCIIEncoding.ASCII.GetBytes(key); //建立加密对象的密钥和偏移量
des.IV = ASCIIEncoding.ASCII.GetBytes(key);  //原文使用ASCIIEncoding.ASCII方法的GetBytes方法 byte[] inputByteArray = Encoding.Default.GetBytes(plaintext);//把字符串放到byte数组中 MemoryStream ms = new MemoryStream();//创建其支持存储区为内存的流 
//定义将数据流链接到加密转换的流
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, , inputByteArray.Length);
cs.FlushFinalBlock();
//上面已经完成了把加密后的结果放到内存中去
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
ret.ToString();
return ret.ToString();
}
/// <summary>
/// 利用DES解密算法解密密文(可解密)
/// </summary>
/// <param name="ciphertext">被解密的字符串</param>
/// <param name="key">密钥(只支持8个字节的密钥,同前面的加密密钥相同)</param>
/// <returns>返回被解密的字符串</returns>
private static string DecryptString(string ciphertext, string key)
{
try
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] inputByteArray = new byte[ciphertext.Length / ];
for (int x = ; x < ciphertext.Length / ; x++)
{
int i = (Convert.ToInt32(ciphertext.Substring(x * , ), ));
inputByteArray[x] = (byte)i;
} des.Key = ASCIIEncoding.ASCII.GetBytes(key); //建立加密对象的密钥和偏移量,此值重要,不能修改
des.IV = ASCIIEncoding.ASCII.GetBytes(key);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, , inputByteArray.Length); cs.FlushFinalBlock(); //建立StringBuild对象,createDecrypt使用的是流对象,必须把解密后的文本变成流对象
StringBuilder ret = new StringBuilder(); return System.Text.Encoding.Default.GetString(ms.ToArray());
}
catch (Exception)
{
return "error";
}
} #endregion
}
}

2、登录处理过程,写入cookie:

        [HttpPost]
public ActionResult Login(string username,string userpass)
{
if (username=="admin" && userpass=="admin")
{
LoginUser loginuser = new LoginUser();
loginuser.ID = ;
loginuser.UserName = username;
loginuser.Roles = "Administrator";
loginuser.Expires = DateTime.Now.AddHours(); loginuser.Login("Administrator"); return Content("登录成功");
//return RedirectToAction("Index", "Home");
} return RedirectToAction("Login");
}

3、判断用户是否登录:

//是否登录
if(LoginUser.GetUserID("Administrator") > )
{ } // 用户ID
int userID=LoginUser.GetUserID("Administrator") //获取用户名
string userName= LoginUser.GetUser("Administrator").UserName

c#通用登录模块,简单好用,一贴见效的更多相关文章

  1. 网站通用登录模块代码 分类: ASP.NET 2014-12-06 10:49 615人阅读 评论(0) 收藏

    1.HTML部分:     <form id="form1" runat="server">     <script src=".. ...

  2. Springboot之登录模块探索(含Token,验证码,网络安全等知识)

    简介 登录模块很简单,前端发送账号密码的表单,后端接收验证后即可~ 淦!可是我想多了,于是有了以下几个问题(里面还包含网络安全问题): 1.登录时的验证码 2.自动登录的实现 3.怎么维护前后端登录状 ...

  3. ylbtech-Model-Account(通用账户模块设计)

    ylbtech-DatabaseDesgin:ylbtech-Model-Account(通用账户模块设计) ylbtech-Model-Account(通用账户模块设计) 1.A,数据库关系图(Da ...

  4. 登录模块的进化史,带大家回顾java学习历程(二)

    接着前面的登录模块的进化史,带大家回顾java学习历程(一) 继续往下面讲 前面我们去实现登录功能,都是想着要完成这个功能,直接在处理实际业务的类中去开始写具体的代码一步步实现,也就是面向过程的编程. ...

  5. Abp通用配置模块的设计

    引言 约定优于配置,配置趋于灵活 约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处, ...

  6. 基于localStorge开发登录模块的记住密码与自动登录

    前沿||我是乐于分享,善于交流的鸟窝 先做写一篇关于登录模块中记住密码与自动登录的模块.鸟窝微信:jkxx123321 关于这个模块功能模块的由来,这是鸟大大的处女秀,为什么这么说呢?一天在群里,一个 ...

  7. Flask10 登录模块、表单框架、表单渲染、表单验证、bookie、请求之前钩子、g对象、编写装饰器

    from flask import Flask from flask import request from flask import render_template from flask_wtf i ...

  8. Java SSH框架系列:用户登录模块的设计与实现思路

    1.简介用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等.如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问.二.简单设计及实现本程序是基于Jav ...

  9. 移动IM开发指南3:如何优化登录模块

    <移动IM开发指南>系列文章将会介绍一个IM APP的方方面面,包括技术选型.登陆优化等.此外,本文作者会结合他在网易云信多年iOS IM SDK开发的经验,深度分析实际开发中的各种常见问 ...

随机推荐

  1. 探索C#之虚拟桶分片

    阅读目录 背景 虚拟桶(virtual buckets) 实现 总结 背景 关于数据分片讨论最多的是一致性hash,然而它并不是分布式设计中的银弹百试百灵. 在数据稳定性要求比较高的场景下它的缺点是不 ...

  2. [开源]基于WPF实现的Gif图片分割器,提取GIf图片中的每一帧

    不知不觉又半个月没有更新博客了,今天终于抽出点时间,来分享一下前段时间的成果. 在网上,我们经常看到各种各样的图片,尤其是GIF图片的动态效果,让整个网站更加富有表现力!有时候,我们看到一些比较好看的 ...

  3. MySQL 子分区

    200 ? "200px" : this.width)!important;} --> 介绍 子分区其实是对每个分区表的每个分区进行再次分隔,目前只有RANGE和LIST分区 ...

  4. WCF:传输EntityFramework 实体类的POCO 代理

    WCF传输EntityFramework 实体类的POCO 代理 Windows Communication Foundation (WCF) 不能对代理进行直接序列化或反序列化,因为 DataCon ...

  5. 初学者 bootstrap(二)----在路上(4)

    ---------------------------------------------------------曾经认真书写的笔记啊,别来无恙啊--------------------------- ...

  6. SikuliX简介及安装

    一.简单介绍 SikuliIDE和Sikuli Script就是现在的SikuliX,最新版本是SikuliX1.1.0, 部分兼容Sikuli JAVA API,支持Python和Ruby,Siku ...

  7. javascript的canvas绘图的基本用法

    <canvas>是HTML里面非常强大的元素,利用它结合js可以实现很多动画效果,大大增强交互性.下面,我想用图文并茂的方式阐述一下canvas的绘图机制的基础内容,话不多说,先上代码: ...

  8. bootstrap中的Grid system详解

    啦啦啦,都十月中旬啦,好快啊,这个月的多一半都过去了,然而我才写第三篇随笔,小颖得加油啦~~~ 下面来看下小颖给大家分享的内容 1.   .col-md-*和.col-xs-* <!doctyp ...

  9. C#互斥体——Mutex

    Mutex对象是一个同步基元,可以用来做线程间的同步. 若多个线程需要共享一个资源,可以在这些线程中使用Mutex同步基元.当某一个线程占用Mutex对象时,其他也需要占用Mutex的线程将处于挂起状 ...

  10. IOS开发之微信山寨版

    为了犒劳自己的学习内容,就山寨个微信的视图控制吧.拿着微信,仔细的看了一下,主要用到了TabBarController以及配置TabBarItem, NavigationController以及配置N ...