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)); }
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)); }