예제 #1
0
        /// <summary>
        /// Tạo người dùng lưu vào Database
        /// <param name="registerDetails">Model đăng kí tài khoản mới</param>
        /// <returns></returns>
        private ACCOUNT CreateUser(RegisterViewModel registerDetails)
        {
            var passwordSalt = CreateSalt();
            var user         = new ACCOUNT
            {
                NAME         = registerDetails.Username,
                SALT         = passwordSalt,
                EMAIL        = registerDetails.Email,
                PASSWORDHASH = EncryptPassword(registerDetails.Password, passwordSalt),
                IMAGEACC     = imgnormal
            };


            DbContextTransaction dt = db.Database.BeginTransaction();

            try
            {
                db.ACCOUNTs.Add(user);
                db.SaveChanges();
                ACCOUNT_ROLE role = new ACCOUNT_ROLE();
                role.IDROLE = 2;
                role.IDUSER = user.ID;
                db.ACCOUNT_ROLE.Add(role);
                db.SaveChanges();
                dt.Commit();
            }
            catch (Exception ex)
            {
                dt.Rollback();
            }

            return(user);
        }
예제 #2
0
        /// <summary>
        /// Tạo token cho người dùng đăng nhập facebook, google...
        /// </summary>
        /// <param name="user">Thông tin cơ bản người dùng</param>
        /// <param name="dbUser">Thông báo User trong Response</param>
        /// <returns></returns>
        private static string CreateTokenLogin(ACCOUNT user, out object dbUser)
        {
            FOODEntities db        = new FOODEntities();
            var          unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
            var          expiry    = Math.Round((DateTime.UtcNow.AddHours(2) - unixEpoch).TotalSeconds);
            var          issuedAt  = Math.Round((DateTime.UtcNow - unixEpoch).TotalSeconds);
            var          notBefore = Math.Round((DateTime.UtcNow.AddMonths(6) - unixEpoch).TotalSeconds);
            ACCOUNT_ROLE account   = db.ACCOUNT_ROLE.FirstOrDefault(x => x.IDUSER == user.ID);
            LIST_ROLE    listrole  = db.LIST_ROLE.FirstOrDefault(x => x.ID == account.IDROLE);
            var          payload   = new Dictionary <string, object>
            {
                { "email", user.EMAIL },
                { "userId", user.ID },
                { "role", listrole.NAME },
                { "sub", user.ID },
                { "nbf", notBefore },
                { "iat", issuedAt },
                { "exp", expiry }
            };

            //var secret = ConfigurationManager.AppSettings.Get("jwtKey");
            const string apikey = "secretKey";

            var token = JsonWebToken.Encode(payload, apikey, JwtHashAlgorithm.HS256);

            dbUser = new { user.ID, user.NAME, user.IMAGEACC };
            return(token);
        }
예제 #3
0
        public async Task <HttpResponseMessage> RegisterExternal(RegisterExternalBindingModel model)
        {
            HttpResponseMessage response;
            string  name     = "";
            string  birthday = "";
            string  gender   = "";
            string  email    = "";
            string  picture  = "";
            dynamic myInfo   = "";
            var     token    = "";

            if (!ModelState.IsValid)
            {
                response = Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }
            var verifiedAccessToken = await VerifyExternalAccessToken(model.Provider, model.ExternalAccessToken);

            if (verifiedAccessToken == null)
            {
                response = Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid Provider or External Access Token");
            }
            EXTERNALACCOUNT user = db.EXTERNALACCOUNTs.FirstOrDefault
                                       (x => x.PROVIDERKEY == verifiedAccessToken.user_id & x.LOGINPROVIDER == model.Provider);
            bool   hasRegistered = user != null;
            object dbUser;

            if (hasRegistered)
            {
                ACCOUNT account1 = db.ACCOUNTs.FirstOrDefault(x => x.ID == user.IDUSER);
                token    = CreateTokenLogin(account1, out dbUser);
                response = Request.CreateResponse(new { dbUser, token });
                return(response);
            }
            if (model.Provider == "Facebook")
            {
                var fb = new FacebookClient(model.ExternalAccessToken);
                myInfo = fb.Get("/me?fields=name,id,gender,birthday,email,picture");
                if (myInfo["email"] != "")
                {
                    email = myInfo["email"];
                }
                if ((myInfo["name"] != ""))
                {
                    name = myInfo["name"];
                }
                try
                { picture = picture = String.Format("https://graph.facebook.com/{0}/picture?width=200&height=200", verifiedAccessToken.user_id); }
                catch (Exception ex)
                { }
            }

            if (model.Provider == "Google")
            {
                HttpClient client     = new HttpClient();
                var        urlProfile = "https://www.googleapis.com/oauth2/v1/userinfo?access_token=" + model.ExternalAccessToken;
                client.CancelPendingRequests();
                HttpResponseMessage output = await client.GetAsync(urlProfile);

                if (output.IsSuccessStatusCode)
                {
                    string outputData = await output.Content.ReadAsStringAsync();

                    GoogleUserOutputData serStatus = JsonConvert.DeserializeObject <GoogleUserOutputData>(outputData);

                    if (serStatus != null)
                    {
                        if (!string.IsNullOrEmpty(serStatus.email))
                        {
                            email = serStatus.email;
                        }
                        if (!string.IsNullOrEmpty(serStatus.name))
                        {
                            name = serStatus.name;
                        }
                        if (!string.IsNullOrEmpty(serStatus.picture))
                        {
                            picture = serStatus.picture;
                        }
                    }
                }
            }

            EXTERNALACCOUNT external = new EXTERNALACCOUNT();
            ACCOUNT         usermain = new ACCOUNT();
            ACCOUNT         acc      = new ACCOUNT();

            acc = db.ACCOUNTs.FirstOrDefault(x => x.EMAIL == email);
            if (acc != null)
            {
                external.PROVIDERKEY   = verifiedAccessToken.user_id;
                external.IDUSER        = acc.ID;
                external.LOGINPROVIDER = model.Provider;
                db.EXTERNALACCOUNTs.Add(external);
                db.SaveChanges();
            }
            else
            {
                external.PROVIDERKEY   = verifiedAccessToken.user_id;
                external.IDUSER        = db.ACCOUNTs.Count() + 1;
                external.LOGINPROVIDER = model.Provider;
                if (!string.IsNullOrEmpty(email))
                {
                    usermain.EMAIL = email;
                }
                if (!string.IsNullOrEmpty(name))
                {
                    usermain.NAME = name;
                }
                usermain.ID = external.IDUSER;
                ACCOUNT_ROLE role = new ACCOUNT_ROLE();
                role.IDUSER = external.IDUSER;
                role.IDROLE = 2;
                if (!string.IsNullOrEmpty(picture))
                {
                    Account account = new Account("dqabuxewl", "198449299438919", "SRASj3YoFcfLsetrHFNNwGVF4qQ");
                    CloudinaryDotNet.Cloudinary cloudinary = new CloudinaryDotNet.Cloudinary(account);

                    var uploadParams = new ImageUploadParams()
                    {
                        File = new FileDescription(picture)
                    };

                    var uploadResult = cloudinary.Upload(uploadParams);
                    usermain.IMAGEACC = uploadResult.Uri.OriginalString;
                }
                else
                {
                    usermain.IMAGEACC = imgnormal;
                }
                DbContextTransaction dt = db.Database.BeginTransaction();
                try
                {
                    db.EXTERNALACCOUNTs.Add(external);
                    db.SaveChanges();
                    db.ACCOUNTs.Add(usermain);
                    db.SaveChanges();
                    db.ACCOUNT_ROLE.Add(role);
                    db.SaveChanges();
                    dt.Commit();
                }
                catch (Exception ex)
                {
                    dt.Rollback();
                    return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Error"));
                }
            }

            //Create token
            usermain = new ACCOUNT();
            usermain = db.ACCOUNTs.FirstOrDefault(x => x.EMAIL == email);
            token    = CreateTokenLogin(usermain, out dbUser);
            response = Request.CreateResponse(new { dbUser, token });
            return(response);
        }