Exemplo n.º 1
0
        public async Task <IActionResult> CreateAccountAndBind(SignInViewModel model)
        {
            var  app    = (await _apiService.AppInfoAsync(model.AppId)).App;
            bool exists = _dbContext.UserEmails.Any(t => t.EmailAddress == model.UserDetail.Email.ToLower());

            if (exists)
            {
                ModelState.AddModelError(string.Empty, $"An user with email '{model.UserDetail.Email}' already exists!");
                model.AppImageUrl = app.IconPath;
                model.CanFindAnAccountWithEmail = false;
                model.Provider = _authProviders.SingleOrDefault(t => t.GetName().ToLower() == model.ProviderName.ToLower());
                return(View(nameof(SignIn), model));
            }
            var user = new GatewayUser
            {
                UserName          = model.UserDetail.Email + $".from.{model.ProviderName}.com",
                Email             = model.UserDetail.Email,
                NickName          = model.UserDetail.Name,
                PreferedLanguage  = model.PreferedLanguage,
                IconFilePath      = Values.DefaultImagePath,
                RegisterIPAddress = HttpContext.Connection.RemoteIpAddress.ToString()
            };
            var result = await _userManager.CreateAsync(user);

            if (result.Succeeded)
            {
                var primaryMail = new UserEmail
                {
                    EmailAddress  = model.UserDetail.Email.ToLower(),
                    OwnerId       = user.Id,
                    ValidateToken = Guid.NewGuid().ToString("N")
                };
                _dbContext.UserEmails.Add(primaryMail);
                await _dbContext.SaveChangesAsync();

                var link = new ThirdPartyAccount
                {
                    OwnerId      = user.Id,
                    ProviderName = model.ProviderName,
                    OpenId       = model.UserDetail.Id
                };
                _dbContext.ThirdPartyAccounts.Add(link);
                await _dbContext.SaveChangesAsync();

                await _signInManager.SignInAsync(user, isPersistent : true);

                await _authLogger.LogAuthRecord(user.Id, HttpContext, true, model.AppId);

                return(await _authManager.FinishAuth(user, model, app.ForceConfirmation));
            }
            else
            {
                model.AppImageUrl = app.IconPath;
                model.CanFindAnAccountWithEmail = await _dbContext.UserEmails.AnyAsync(t => t.EmailAddress.ToLower() == model.UserDetail.Email.ToLower());

                model.Provider = _authProviders.SingleOrDefault(t => t.GetName().ToLower() == model.ProviderName.ToLower());
                ModelState.AddModelError(string.Empty, result.Errors.First().Description);
                return(View(nameof(SignIn), model));
            }
        }
Exemplo n.º 2
0
        public async Task <IActionResult> CreateAccountAndBind(SignInViewModel model)
        {
            if (string.IsNullOrWhiteSpace(model.UserDetail.Email))
            {
                model.UserDetail.Email = model.UserDetail.Name + $"@from.{model.ProviderName}.com";
            }
            bool exists = _dbContext.UserEmails.Any(t => t.EmailAddress == model.UserDetail.Email.ToLower());

            if (exists)
            {
                // TODO: Handle.
                throw new AiurAPIModelException(ErrorType.HasDoneAlready, $"An user with email '{model.UserDetail.Email}' already exists!");
            }
            var app  = (await _apiService.AppInfoAsync(model.AppId)).App;
            var user = new GatewayUser
            {
                UserName          = model.UserDetail.Email + $".from.{model.ProviderName}.com",
                Email             = model.UserDetail.Email,
                NickName          = model.UserDetail.Name,
                PreferedLanguage  = model.PreferedLanguage,
                IconFilePath      = Values.DefaultImagePath,
                RegisterIPAddress = HttpContext.Connection.RemoteIpAddress.ToString()
            };
            var result = await _userManager.CreateAsync(user);

            if (result.Succeeded)
            {
                var primaryMail = new UserEmail
                {
                    EmailAddress  = model.UserDetail.Email.ToLower(),
                    OwnerId       = user.Id,
                    ValidateToken = Guid.NewGuid().ToString("N")
                };
                _dbContext.UserEmails.Add(primaryMail);
                await _dbContext.SaveChangesAsync();

                var link = new ThirdPartyAccount
                {
                    OwnerId      = user.Id,
                    ProviderName = model.ProviderName,
                    OpenId       = model.UserDetail.Id
                };
                _dbContext.ThirdPartyAccounts.Add(link);
                await _dbContext.SaveChangesAsync();

                await _signInManager.SignInAsync(user, isPersistent : true);

                await _authLogger.LogAuthRecord(user.Id, HttpContext, true, model.AppId);

                return(await _authManager.FinishAuth(user, model, app.ForceConfirmation));
            }
            else
            {
                // TODO: Handle
                throw new AiurAPIModelException(ErrorType.HasDoneAlready, result.Errors.First().Description);
            }
        }
Exemplo n.º 3
0
 public void UpdateThirdPartyAccountMapping(int accountId, ThirdPartyAccount thirdPartyAccount,
     SqlHelper sqlHelper)
 {
     List<SqlParameter> mappingParams = new List<SqlParameter>
     {
         new SqlParameter("id", thirdPartyAccount.MapId)
     };
     var query = $@"DELETE FROM [dbo].[account_to_third_party_account_mapping] where [id] = @id";
     sqlHelper.Update(query, CommandType.Text, mappingParams.ToArray());
 }
Exemplo n.º 4
0
 public AccountToThirdPartyAccountMapping CreateThirdPartyAccountMapping(int accountId,
     ThirdPartyAccount thirdPartyAccount)
 {
     AccountToThirdPartyAccountMapping obj = new AccountToThirdPartyAccountMapping();
     obj.AccountId = accountId;
     obj.CreatedBy = "John Smith";
     obj.CreatedDate = DateTime.UtcNow;
     obj.ThirdPartyAccountId = thirdPartyAccount.ThirdPartyAccountId;
     return obj;
 }
Exemplo n.º 5
0
        public async Task <IActionResult> BindAccount(BindAccountAddressModel model)
        {
            var user = await GetCurrentUserAsync();

            if (user.ThirdPartyAccounts.Any(t => t.ProviderName == model.ProviderName))
            {
                var toDelete = await _dbContext.ThirdPartyAccounts
                               .Where(t => t.OwnerId == user.Id)
                               .Where(t => t.ProviderName == model.ProviderName)
                               .ToListAsync();

                _dbContext.ThirdPartyAccounts.RemoveRange(toDelete);
                await _dbContext.SaveChangesAsync();
            }
            var provider = _authProviders.SingleOrDefault(t => t.GetName().ToLower() == model.ProviderName.ToLower());

            if (provider == null)
            {
                // TODO: Handle.
                throw new NotImplementedException($"Provider: '{model.ProviderName}' is not implemented!");
            }
            IUserDetail info;

            try
            {
                info = await provider.GetUserDetail(model.Code, true);
            }
            catch (AiurAPIModelException)
            {
                var refreshlink = provider.GetBindRedirectLink();
                return(Redirect(refreshlink));
            }
            var link = new ThirdPartyAccount
            {
                OwnerId      = user.Id,
                OpenId       = info.Id,
                ProviderName = provider.GetName(),
                Name         = info.Name
            };

            _dbContext.ThirdPartyAccounts.Add(link);
            await _dbContext.SaveChangesAsync();

            // Complete
            var viewModel = new BindAccountViewModel
            {
                UserDetail = info,
                Provider   = provider,
                User       = user
            };

            return(View(viewModel));
        }
Exemplo n.º 6
0
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            Int32 ResultIsOpenIDBinding = 0;
            Source = Request.QueryString["Source"];
            if ("0".Equals(Source))
            {
                if (string.IsNullOrEmpty(cookie["AccessToken"]))
                {
                    Response.Redirect("SinaLogin.aspx");
                }
                else
                {
                    Sina = new Client(new OAuth(ConfigurationManager.AppSettings["AppKey"], ConfigurationManager.AppSettings["AppSecret"], cookie["AccessToken"], null)); //用cookie里的accesstoken来实例化OAuth,这样OAuth就有操作权限了
                }

                SinaOpenID = Sina.API.Account.GetUID();

                ResultIsOpenIDBinding = ThirdPartyAccount.IsOpenIdHasBindingCustId("0", SinaOpenID, out CustID, out ErrMsg);
                if (ResultIsOpenIDBinding == 0)
                {
                    // 代表SinaOpenId 已经和某个custId建立绑定关系
                }
                else
                {
                    // 没有绑定关系则可能有两种情况1.有custid了,但是没绑定,2.没有custid ,这两种情况都得redirect 左绑右注册页面 ->建立绑定关系
                }
            }
            else if ("1".Equals(Source))
            {
                QQCallback();
                ResultIsOpenIDBinding = ThirdPartyAccount.IsOpenIdHasBindingCustId("1", openid, out CustID, out ErrMsg);
                if (ResultIsOpenIDBinding == 0)
                {
                    // 代表qqOpenId 已经和某个custId建立绑定关系
                }
                else
                {
                    // 没有绑定关系则可能有两种情况1.有custid了,但是没绑定,2.没有custid ,这两种情况都得redirect 左绑右注册页面 ->建立绑定关系
                }
            }
            else
            {
                // 即不是qq也不是sina,应该去哪里?
                Response.Redirect("Error.aspx");
            }
        }
    }
Exemplo n.º 7
0
        public async Task <IActionResult> BindAccount(BindAccountAddressModel model)
        {
            var user = await GetCurrentUserAsync();

            if (user.ThirdPartyAccounts.Any(t => t.ProviderName == model.ProviderName))
            {
                var toDelete = await _dbContext.ThirdPartyAccounts
                               .Where(t => t.OwnerId == user.Id)
                               .Where(t => t.ProviderName == model.ProviderName)
                               .ToListAsync();

                _dbContext.ThirdPartyAccounts.RemoveRange(toDelete);
                await _dbContext.SaveChangesAsync();
            }
            var provider = _authProviders.SingleOrDefault(t => t.GetName().ToLower() == model.ProviderName.ToLower());

            if (provider == null)
            {
                return(NotFound());
            }
            IUserDetail info;

            try
            {
                info = await provider.GetUserDetail(model.Code, true);
            }
            catch (AiurAPIModelException)
            {
                var refreshLink = provider.GetBindRedirectLink();
                return(Redirect(refreshLink));
            }
            if (await _dbContext.ThirdPartyAccounts.AnyAsync(t => t.OpenId == info.Id))
            {
                // The third-party account already bind an account.
                return(View(viewName: "BindFailed", model: new BindAccountViewModel
                {
                    UserDetail = info,
                    Provider = provider,
                    User = user
                }));
            }
            var link = new ThirdPartyAccount
            {
                OwnerId      = user.Id,
                OpenId       = info.Id,
                ProviderName = provider.GetName(),
                Name         = info.Name
            };
            await _dbContext.ThirdPartyAccounts.AddAsync(link);

            await _dbContext.SaveChangesAsync();

            // Complete
            var viewModel = new BindAccountViewModel
            {
                UserDetail = info,
                Provider   = provider,
                User       = user
            };

            return(View(viewModel));
        }
Exemplo n.º 8
0
 public void Init()
 {
     instance = new ThirdPartyAccount();
 }