c#通用登录模块分享
程序员文章站
2022-05-18 13:00:09
// 举个例子:一个网站有用户系统、商家系统、网站后台3个系统
//可以分3个usertype, user ,shop , system
//网站后台一般都有角色,如a...
// 举个例子:一个网站有用户系统、商家系统、网站后台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 0; } /// <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(-1); 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, 0, 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 / 2]; for (int x = 0; x < ciphertext.length / 2; x++) { int i = (convert.toint32(ciphertext.substring(x * 2, 2), 16)); 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, 0, 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 = 1; loginuser.username = username; loginuser.roles = "administrator"; loginuser.expires = datetime.now.addhours(2); loginuser.login("administrator"); return content("登录成功"); //return redirecttoaction("index", "home"); } return redirecttoaction("login"); }
3、判断用户是否登录:
//是否登录 if(loginuser.getuserid("administrator") > 0) { } // 用户id int userid=loginuser.getuserid("administrator") //获取用户名 string username= loginuser.getuser("administrator").username
再来分享一个示例
1.html部分:
<form id="form1" runat="server"> <script src="../script/jquery-v1.10.2.js" type="text/javascript"></script> <script src="login.js" type="text/javascript"></script> <div class="" style="height: 160px"> <div> <label for="username"> 帐号:</label> <input type="text" name="username" /> </div> <div> <label for="password"> 密码:</label> <input type="password" name="password" /> </div> <input type="submit" id="btnsumit" value="登录" /> <p class="msg"> </p> </div> </form>
2.引入登录插件:login.js
/*! * 插件名称:登录插件封装,使用方法: $('#form1').login({ url: "loginhandler.ashx",//处理登录验证逻辑的url username: $("input[name='username']"),//用户名输入框 password: $("input[name='password']"),//密码输入框 msg: $(".msg"), //提示信息 button: $("#btnsumit") //提交按钮 }); */ (function ($) { $.fn.login = function (option) { var defaults = { url: '/account/login/', msg: $(this).find('.msg'), username: $(this).find("input[name='username']"), password: $(this).find("input[name='password']"), button: $(this).find("#button") }; var options = $.extend(defaults, option); var errmsg = { 'inputusername': '请输入用户名', 'inputpassword': '请填写登录密码', 'passwordlength': '密码应在6-32位字符内', 'noreg': '此账号未注册', 'inviladusername': '帐号不存在', 'accountnotmatch': '账号密码不匹配', 'userlocked': '帐号锁定中,暂时无法登录', 'serverdown': '服务器繁忙,请稍后再试' }; //提交数据 function submit() { var usernameinput = $.trim(options.username.val()); var passwordinput = $.trim(options.password.val()); if (usernameinput == '') { showmsg('登录名不能为空'); options.username.focus(); return; } if (passwordinput == '') { showmsg('密码不能为空'); options.password.focus(); return; } $.ajax({ type: "post", url: options.url, data: "username=" + usernameinput + "&password=" + passwordinput, success: function (msg) { var result = eval("[" + msg + "]")[0]; if (result.status == "ok") { //登录成功处理 showmsg("登录成功...."); } else { showmsg(errmsg[result.status]); } } }); } //显示错误信息 function showmsg(msg) { options.msg.html(msg); } //绑定按钮事件 options.button.bind('click', function () { submit(); return false; }); }; })(jquery);
3.页面调用插件:
<script type="text/javascript"> $('#form1').login({ url: "ajaxlogin.aspx", username: $("input[name='username']"), password: $("input[name='password']"), msg: $(".msg"), button: $("#btnsumit") }); </script>
4.后台处理逻辑(请根据实际需求做相应调整)
using system; using system.web; using system.web.ui; namespace whir.sitefactory.website.admin.account { public partial class ajaxlogin : page { protected void page_load(object sender, eventargs e) { string status = processlogin(); response.clear(); response.write(status); response.end(); } private string processlogin() { try { string username = httpcontext.current.request.form["username"]; string password = httpcontext.current.request.form["password"]; if (string.isnullorempty(username)) { return "{status:'inputusername'}"; //请输入用户名 } if (string.isnullorempty(password)) { return "{status:'inputpassword'}"; //请填写登录密码 } if (password.length < 6 || password.length > 32) { return "{status:'passwordlength'}"; //密码应在6-32位字符内 } //var user = userservice.getuserbyname(username); //if (user == null) //{ // return "{status:'inviladusername'}"; //帐号不存在 //} //if (user.islocked) //{ // return "{status:'userlocked'}"; //帐号锁定中,暂时无法登录 //} //if (user.password.tolower() != password.tomd5().tolower()) //{ // return "{accountnotmatch:'ok'}"; //账号密码不匹配 //} //其他操作: //写入客户端cookie //登录日志 return "{status:'ok'}"; //登录成功 } catch (exception ex) { return "{status:'serverdown'}"; //服务器繁忙,请稍后再试 } } } }