软件编程
位置:首页>> 软件编程>> C#编程>> c#通用登录模块分享

c#通用登录模块分享

作者:hebedich  发布时间:2023-07-21 15:54:31 

标签:c#,登录模块

// 举个例子:一个网站有用户系统、商家系统、网站后台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'}"; //服务器繁忙,请稍后再试
     }
   }
 }
}
0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com