コード例 #1
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));
        }
コード例 #2
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));
        }