#region
using System;
using System.Text;
using CSFrameworkV5.Common;
using CSFrameworkV5.Core;
#endregion
namespace CSFrameworkV5.WCFContract
{
///
/// WebService接口安全管理核心类
///
public class WebServiceSecurity
{
private const int WCF_PREFIX_LEN = 16; /*预设伪造16位的数据(校验码)*/
private const int WCF_SUFFIX_LEN = 8; /*预设伪造8位的数据(校验码)*/
///
/// 加密用户登录凭证
///
/// 当前用户登录信息
///
public static byte[] EncryptLoginer(Loginer user)
{
var user_byte = ZipTools.CompressionObject(user);
var result =
new byte[user_byte.Length + WCF_PREFIX_LEN + WCF_SUFFIX_LEN];
var prefix = GetByteData(WCF_PREFIX_LEN);
var suffix = GetByteData(WCF_SUFFIX_LEN);
Array.Copy(user_byte, 0, result, WCF_PREFIX_LEN,
user_byte.Length); //复制用户数据
Array.Copy(prefix, 0, result, 0, prefix.Length); //复制头部伪码
Array.Copy(suffix, 0, result, result.Length - WCF_SUFFIX_LEN,
suffix.Length); //复制尾部伪码
return result;
}
///
/// 用户登录信息加密后伪造指定位数的数据.
///
private static byte[] GetByteData(int bit)
{
//128位伪造数据
var chars = "ZA1D30A4B5C006S3LDFGHKD72C8E920D" +
"FJKQ30F506E7EQWERUIYUI02F1A0D0IO" +
"WEURTK236890L23B3B40C5E180D6F4D5" +
"EOPFDGHKW3IT6F4X90238503AS1094A2";
if (bit < 2) bit = 2; //最少两位
var n = GetRandomNum(chars.Length - bit - 2); //获取随机数
var s = chars.Substring(n - 1, bit);
var result = Encoding.ASCII.GetBytes(s);
return result;
}
///
/// 自定义用户登录验证码
///
///
public static byte[] GetLoginTicket()
{
var result = Encoding.ASCII.GetBytes(Globals.WCF_LOGIN_TICKET);
return result;
}
//获取随机数
private static int GetRandomNum(int maxValue)
{
var seed = new Random();
var randomNum = new Random();
return randomNum.Next(1, maxValue);
}
///
/// 检查用户登录凭证,验证通过才允许访问后台数据.
///
/// 用户登录凭证
///
public static Loginer ValidateLoginer(byte[] loginer)
{
//用户登录信息的长度小于伪码长度,数据包无效!
if (loginer.Length < WCF_PREFIX_LEN + WCF_SUFFIX_LEN) //return null;
throw new Exception("验证用户资料失败!");
try
{
//用户登录信息的长度
var objectArrar = new byte[loginer.Length -
(WCF_PREFIX_LEN + WCF_SUFFIX_LEN)];
//复制用户登录信息的数据包(去掉前后伪码)
Array.Copy(loginer, WCF_PREFIX_LEN, objectArrar, 0,
objectArrar.Length);
//转换为用户对象
var user = (Loginer)ZipTools.DecompressionObject(objectArrar);
if (user.Account.Length >= 1) //系统限制用户帐号的长度必须大于或等于1位
return user; //转换成功,返回用户对象.
throw new Exception("用户帐号不正确!");
}
catch
{
throw new Exception("验证用户资料失败!");
}
}
///
/// 用户登录的验证码,防止用户恶意攻击Login接口.
///
/// 验证码
///
public static bool ValidateLoginIdentity(byte[] validationTicket)
{
if (validationTicket == null ||
validationTicket.Length < Encoding.ASCII
.GetBytes(Globals.WCF_LOGIN_TICKET).Length)
throw new Exception("验证用户资料失败!");
//取系统定义的验证码,你可以定义为128位.
var TicketString =
Encoding.ASCII.GetString(GetLoginTicket()).ToUpper();
//客户端传来的验证码与系统定义的相比较
var success =
Encoding.ASCII.GetString(validationTicket).ToUpper() ==
TicketString;
if (success == false)
throw new Exception("无效的验证码! 你还可以尝试X次,否则查你户口,封你IP!");
return success;
//
//设计一个防止用户恶意攻击的管理器,记录每次调用的方法名及调用时间,
//如果在指定的时间内调用超过最大限制数则视为恶意攻击,你可以暂时封杀
//用户的IP.
//
}
}
}