110,535
社区成员
发帖
与我相关
我的任务
分享
public class OnlineManage
{
/// <summary>
/// 用户会话列表
/// </summary>
public static List<Session> Sessions { get; set; }
/// <summary>
/// 最大在线用户数
/// </summary>
public static int MaxAuthorized { get; set; }
/// <summary>
/// 构造方法
/// </summary>
public OnlineManage()
{
Sessions = new List<Session>();
MaxAuthorized = Convert.ToInt32(ConfigurationManager.AppSettings["MaxAuthorized"]);
}
/// <summary>
/// 会话合法性验证
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static bool Verification(Session obj)
{
if (obj == null) return false;
var us = Sessions.Find(s => s.UserId == obj.UserId);
if (us != null && us.Signature == obj.Signature)
{
us.LastConnect = DateTime.Now;
return true;
}
else
{
return false;
}
}
}
Session类:
public class Session
{
/// <summary>
/// 会话ID
/// </summary>
public Guid SessionId { get; set; }
/// <summary>
/// 登录用户ID
/// </summary>
public Guid UserId { get; set; }
/// <summary>
/// 登录部门ID
/// </summary>
public Guid? DeptId { get; set; }
/// <summary>
/// 用户账号
/// </summary>
public string LoginName { get; set; }
/// <summary>
/// 登录用户名
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 登录部门全称
/// </summary>
public string DeptName { get; set; }
/// <summary>
/// WCF服务基地址
/// </summary>
public string BaseAddress { get; set; }
/// <summary>
/// 用户签名
/// </summary>
public string Signature { get; set; }
/// <summary>
/// 用户机器码
/// </summary>
public string MachineId { get; set; }
/// <summary>
/// 上次连接时间
/// </summary>
public DateTime LastConnect { get; set; }
/// <summary>
/// 用户登录状态
/// </summary>
public LoginResult LoginStatus { get; set; }
}
public enum LoginResult
{
Success,
Failure,
Online,
Banned,
NotExist,
Unauthorized
}
服务端Login方法
public Session UserLogin(Session obj)
{
if (obj == null) return null;
if (OnlineManage.Sessions.Count >= OnlineManage.MaxAuthorized)
{
obj.LoginStatus = LoginResult.Unauthorized;
return obj;
}
var user = CommonDAL.GetUser(obj.LoginName);
if (user == null)
{
obj.LoginStatus = LoginResult.NotExist;
return obj;
}
var us = OnlineManage.Sessions.Find(s => s.UserId == user.ID);
if (user.Password.ToUpper() != obj.Signature)
{
obj.LoginStatus = LoginResult.Failure;
}
else if (!user.Validity)
{
obj.LoginStatus = LoginResult.Banned;
}
else
{
obj.UserId = user.ID;
obj.UserName = user.Name;
obj.LastConnect = DateTime.Now;
if (us != null && us.MachineId != obj.MachineId)
{
obj.LoginStatus = LoginResult.Online;
}
else
{
obj.LoginStatus = LoginResult.Success;
OnlineManage.Sessions.Add(obj);
OnlineManage.Sessions.Remove(us);
}
}
return obj;
}
客户端longin方法:
private void btnLogin_Click(object sender, EventArgs e)
{
Session.LoginName = txtUserName.Text.Trim();
if (string.IsNullOrEmpty(Session.LoginName))
{
General.ShowMessage("请输入用户名!");
txtUserName.Focus();
return;
}
if (String.IsNullOrEmpty(txtPassWord.Text))
{
General.ShowWarning("密码不能为空!");
txtPassWord.Focus();
return;
}
Session.Signature = General.GetHash(txtPassWord.Text.Trim());
Session.DeptId = (Guid?)lokDepartment.EditValue;
Session.DeptName = lokDepartment.EditValue == null ? null : lokDepartment.Text;
using (var cli = new LoginClient(Binding, _Address))
{
Session = cli.UserLogin(Session);
}
switch (Session.LoginStatus)
{
case LoginResult.Success:
panel.Visible = false;
ShowProgress("正在加载主窗体,请稍候…");
Config.SaveUserName(Session.LoginName);
DialogResult = DialogResult.OK;
break;
case LoginResult.Failure:
General.ShowWarning("对不起,您输入的密码不正确!\r\n如果您不知道或遗忘自己的密码,请联系管理员。");
txtPassWord.EditValue = null;
txtPassWord.Focus();
break;
case LoginResult.Online:
General.ShowWarning("对不起,当前用户已登录!\r\n如果您已经退出系统,请稍后再试。");
break;
case LoginResult.NotExist:
General.ShowWarning("该账户不存在!请检查输入的用户名。\r\n如果您不知道自己的用户名,请联系管理员。");
txtUserName.EditValue = null;
txtUserName.Focus();
break;
case LoginResult.Banned:
General.ShowWarning("该账户已封禁!在解封前您不能登录系统。\r\n如果您需要使用该账号登录系统,请联系管理员。");
break;
case LoginResult.Unauthorized:
General.ShowWarning("在线用户数已达上限!您缺少足够的授权数量。\r\n请联系开发商购买足够的用户授权数量。");
break;
}
}