예제 #1
0
        /// <summary>
        /// 创建HttpTunnel
        /// </summary>
        /// <param name="proxyClient"></param>
        /// <param name="cmd"></param>
        /// <returns></returns>
        /// <exception cref="System.Net.TunnelStateMissingException"></exception>
        private HttpClient CreateTunnel(TunnelCommand cmd, TcpClient proxyClient)
        {
            var tunnel = new HttpClient((Uri)xHttpServer.GetRandom(this.ServerBalance));

            switch (cmd)
            {
            case TunnelCommand.KeepAlive:
                tunnel.KeepAlive = false;
                break;

            default:
                tunnel.KeepAlive = true;
                break;
            }
            tunnel.SendReceiveTimeout = xHttpHandler.Timeout * 1000;
            var cred = this.Credential;

            tunnel.Headers[xHttpHandler.AgentAuth] = CryptoManaged.MD5Hex(string.Format("{0}:{1}", cred.UserName, cred.Password));
            if (proxyClient != null)
            {
                var state = this.GetClientState(proxyClient);
                tunnel.Headers[xHttpHandler.AgentSock]   = state.UniqueID.ToString("N");
                tunnel.Headers[xHttpHandler.AgentDirect] = state.ToString();
            }
            var rRemoteID = this.ReverseRemoteID;

            if (rRemoteID != null)
            {
                tunnel.Headers[xHttpHandler.AgentReverse] = string.Format("{0}#{1}", _clientID.ToString("N"), rRemoteID.Value.ToString("N"));
            }
            tunnel.Form[xHttpHandler.AgentCommand] = ((int)cmd).ToString();
            return(tunnel);
        }
예제 #2
0
        public void ChangePassword(ChangePasswordParameter param)
        {
            using (var context = base.CreateUserContext())
            {
                EmailAuth  emailAuth  = null;
                MobileAuth mobileAuth = null;
                if (param.AuthCode != null)
                {
                    Guid emailAuthCode;
                    if (Guid.TryParse(param.AuthCode, out emailAuthCode))
                    {
                        emailAuth = this.CheckUserEmailAuth(context, emailAuthCode);
                    }
                    else
                    {
                        string[] mobileAuthCode = param.AuthCode.Split(',');
                        if (mobileAuthCode.Length != 2)
                        {
                            throw new InvalidInvokeException("参数错误");
                        }
                        mobileAuth     = this.CheckUserMobileAuth(context, mobileAuthCode[0], int.Parse(mobileAuthCode[1]));
                        param.UserName = mobileAuth.UserName;
                    }
                }

                var id = this.SignIn(new SignInParameter()
                {
                    AppID    = param.AppID,
                    UserName = param.UserName,
                    Password = param.OldPassword
                });
                if (!id.IsAuthenticated)
                {
                    throw new InvalidInvokeException("账户不存在或密码错误");
                }

                using (var scope = DbScope.Create())
                {
                    scope.BeginTransaction();

                    param.NewPassword = CryptoManaged.MD5Hex(param.NewPassword);
                    context.Accounts.Update(t => t.RowID == id.UserID, t => new Account()
                    {
                        Password = param.NewPassword
                    });
                    if (emailAuth != null)
                    {
                        emailAuth.Status = (int)ActivationStatus.Activated;
                    }
                    if (mobileAuth != null)
                    {
                        mobileAuth.Status = (int)ActivationStatus.Activated;
                    }
                    context.SaveChanges();

                    scope.Complete();
                }
            }
        }
예제 #3
0
        /// <summary>
        /// 注册
        /// </summary>
        /// <param name="param"></param>
        public void SignUp(SignUpParameter param)
        {
            string orgPwd = param.Password;

            param.Password = CryptoManaged.MD5Hex(param.Password);
            using (var scope = DbScope.Create())
                using (var context = base.CreateUserContext())
                {
                    scope.BeginTransaction();

                    if (this.IsUserNameExists(new IsUserNameExistsParameter()
                    {
                        AppID = param.AppID,
                        UserName = param.UserName
                    }))
                    {
                        throw new InvalidInvokeException(SignUpErrorCode.AccountExist.ToDescription());
                    }

                    var dataObj = new Account();
                    EntityMapper.Map <SignUpParameter, Account>(param, dataObj);
                    dataObj.RowID      = Guid.NewGuid();
                    dataObj.CreateDate = DateTime.Now;
                    context.Accounts.Add(dataObj);
                    context.SaveChanges();

                    if (param.SmsCode != default(int))
                    {
                        VerifyMobile(new VerifyMobileParameter()
                        {
                            Mobile  = param.Mobile,
                            SmsCode = param.SmsCode
                        });
                    }

                    scope.Complete();

                    if (!string.IsNullOrEmpty(param.Email))
                    {
                        this.SendAuthEmail(new SendAuthEmailParameter()
                        {
                            AppID  = param.AppID,
                            UserID = dataObj.RowID,
                            Email  = param.Email,
                            Kind   = AuthEmailKind.SignUp
                        });
                    }
                }
        }
예제 #4
0
        static xHttpHandler()
        {
            ushort.TryParse(ConfigurationManager.AppSettings["Agent-MaxDevice"], out MaxDevice);
            Host = ConfigurationManager.AppSettings["Agent-Host"];
            var q = from t in (ConfigurationManager.AppSettings["Agent-BlockPorts"] ?? string.Empty).Split(',')
                    where !string.IsNullOrEmpty(t)
                    select ushort.Parse(t);

            BlockPorts = q.ToArray();
            CryptoKey  = ConfigurationManager.AppSettings["Agent-CryptoKey"];
            var q2 = from t in (ConfigurationManager.AppSettings["Agent-Credentials"] ?? string.Empty).Split(',')
                     where !string.IsNullOrEmpty(t)
                     select CryptoManaged.MD5Hex(t);

            OnlineUsers = new xUserManager(q2.ToArray());
        }
예제 #5
0
        public override void OnEntry(MethodExecutionArgs args)
        {
            string hashKey = args.Arguments.Count > 0 ? CryptoManaged.MD5Hex(JsonConvert.SerializeObject(args.Arguments, Formatting.None)) : string.Empty;
            string key     = string.Format("{0}.{1}{2}", args.Method.DeclaringType.Name, args.Method.Name, hashKey);
            object result  = Cache[key];

            if (result != null)
            {
                args.FlowBehavior = FlowBehavior.Return;
                args.ReturnValue  = result;
            }
            else
            {
                args.MethodExecutionTag = key;
            }
            base.OnEntry(args);
        }
예제 #6
0
        void IHttpClient.DownloadFile(Uri fileUrl, out string fileName)
        {
            var client = (IHttpClient)this;

            fileName = fileUrl.OriginalString;
            int i = fileName.LastIndexOf("?");

            if (i != -1)
            {
                fileName = fileName.Remove(i);
            }
            fileName = CryptoManaged.MD5Hex(fileUrl.OriginalString) + Path.GetExtension(fileName);
            string localPath    = client.SaveFileDirectory + fileName;
            var    waitDuration = client.RetryWaitDuration;

            try
            {
                if (!App.Retry(() =>
                {
                    this.SetRequest(fileUrl);
                    this.DownloadFile(localPath);
                    var file = new FileInfo(localPath);
                    return(file.Exists && file.Length > 0L);
                }, client.RetryCount.GetValueOrDefault(1), waitDuration.HasValue ? (int)waitDuration.Value.TotalMilliseconds : 0))
                {
                    throw new DownloadException(string.Empty)
                          {
                              RemoteUrl = fileUrl,
                              LocalPath = localPath
                          };
                }
                ;
            }
            catch (Exception ex)
            {
                throw new DownloadException(string.Empty, ex)
                      {
                          RemoteUrl = fileUrl,
                          LocalPath = localPath
                      };
            }
        }
예제 #7
0
        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public SSOIdentity SignIn(SignInParameter param)
        {
            if (param.Password.Length < 32)
            {
                param.Password = CryptoManaged.MD5Hex(param.Password);
            }

            using (var context = base.CreateUserContext())
            {
                var q = from t in context.Accounts
                        where t.AppID == param.AppID &&
                        t.UserName == param.UserName && t.Password == param.Password
                        select new SSOIdentity
                {
                    UserID          = t.RowID,
                    UserName        = t.UserName,
                    Token           = Guid.NewGuid().ToString("N"),
                    IssueDate       = DateTime.Now,
                    IsAuthenticated = true
                };
                var result = q.DefaultIfEmpty(new SSOIdentity()
                {
                    UserName        = param.UserName,
                    IsAuthenticated = false
                }).Single();
                if (param.LogSignIn)
                {
                    var log = new SignInLog();
                    log.UserName   = param.UserName;
                    log.ClientIP   = param.ClientIP;
                    log.Platform   = param.Platform;
                    log.SignInDate = DateTime.Now;
                    log.IsSuccess  = result.IsAuthenticated;
                    context.SignInLogs.Add(log);
                    context.SaveChanges();
                }
                return(result);
            }
        }
예제 #8
0
        public static void UploadFile(HttpContext context, string savePath)
        {
            HttpRequest  Request  = context.Request;
            HttpResponse Response = context.Response;

            var httpFile = Request.Files[0];

            if (httpFile == null)
            {
                Response.StatusCode = 400;  //Bad Request
                Response.End();
            }
            string rangeFilename = CryptoManaged.MD5Hex(httpFile.FileName + httpFile.ContentLength);
            var    file          = new FileInfo(Path.Combine(Path.GetDirectoryName(savePath), rangeFilename));

            Response.AddHeader("Content-Length", (file.Exists ? file.Length : 0L).ToString());
            long offset;

            if (!long.TryParse(Request.Headers["Range"], out offset) || file.Length != offset)
            {
                Response.StatusCode = 416;  //Requested range not satisfiable
                Response.End();
            }

            using (var stream = file.Open(file.Exists ? FileMode.Append : FileMode.CreateNew, FileAccess.Write, FileShare.Write))
            {
                int length = httpFile.ContentLength;

                Response.AddHeader("Content-Range", "bytes " + offset.ToString() + "-" + length.ToString() + "/" + length.ToString());
                Response.StatusCode = 206;
                stream.Position     = offset;
                httpFile.InputStream.FixedCopyTo(stream, length, per =>
                {
                    stream.Flush();
                    return(Response.IsClientConnected);
                });
            }
            Response.End();
        }
예제 #9
0
        public SSOIdentity OAuth(OAuthParameter param)
        {
            int kind = EnumToValue(param.OAuthKind);

            using (var context = base.CreateUserContext())
            {
                var q = from t in context.OpenOAuths
                        where t.OpenID == param.OpenID &&
                        t.OAuthKind == kind
                        select t;
                var  entity = q.SingleOrDefault();
                Guid userID = Guid.Empty;
                // 验证OAuth返回
                if (string.IsNullOrEmpty(param.UserName))
                {
                    if (entity == null)
                    {
                        return(null);
                    }

                    var q2 = from t in context.Accounts
                             join t2 in context.OpenOAuths on t.RowID equals t2.UserID
                             where t2.OpenID == param.OpenID && t2.OAuthKind == kind
                             select new string[] { t.UserName, t.Password };
                    var args = q2.SingleOrDefault();
                    if (args == null)
                    {
                        throw new InvalidInvokeException("用户不存在");
                    }
                    param.UserName = args[0];
                    param.Password = args[1];
                }
                else
                {
                    // 没有帐号,绑定新帐号
                    if (param.UserName == param.OpenID)
                    {
                        param.UserName = CreateNewUserName(param.OpenID, param.OAuthKind);
                        if (!context.Accounts.Any(t => t.AppID == param.AppID && t.UserName == param.UserName))
                        {
                            this.SignUp(new SignUpParameter()
                            {
                                AppID    = param.AppID,
                                UserName = param.UserName,
                                Password = param.Password
                            });
                            Thread.Sleep(200);
                        }
                        goto signIn;
                    }

                    param.Password = CryptoManaged.MD5Hex(param.Password);
                    var q2 = from t in context.Accounts
                             where t.AppID == param.AppID &&
                             t.UserName == param.UserName && t.Password == param.Password
                             select t.RowID;
                    userID = q2.SingleOrDefault();
                    if (userID == Guid.Empty)
                    {
                        throw new InvalidInvokeException("帐号或密码错误");
                    }

                    var q3 = from t in context.OpenOAuths
                             where t.UserID == userID && t.OAuthKind == kind
                             select t;
                    if (q3.Any())
                    {
                        throw new InvalidInvokeException("已经绑定过其它账户");
                    }
                }
signIn:
                var id = this.SignIn(param);
                if (entity == null)
                {
                    if (id.IsAuthenticated)
                    {
                        userID = id.UserID;
                    }
                    if (userID == Guid.Empty)
                    {
                        throw new InvalidInvokeException("UserID's null");
                    }
                    entity = new OpenOAuth();
                    EntityMapper.Map <OAuthParameter, OpenOAuth>(param, entity);
                    entity.UserID     = userID;
                    entity.CreateDate = DateTime.Now;
                    context.OpenOAuths.Add(entity);
                    context.SaveChanges();
                }
                return(id);
            }
        }
예제 #10
0
 internal string HexPassword(string password)
 {
     return(CryptoManaged.MD5Hex(password));
 }