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)); } }
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); } }
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()); }
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; }
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)); }
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"); } } }
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)); }
public void Init() { instance = new ThirdPartyAccount(); }