// 举个例子:一个网站有用户系统、商家系统、网站后台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\'}\"; //服务器繁忙,请稍后再试
}
}
}
}
本文地址:https://www.stayed.cn/item/18238
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我