public async Task <IHttpActionResult> RegisterExternal(RegisterExternalBindingModel model) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var verifiedAccessToken = await usersService.VerifyExternalAccessToken(model.Provider, model.ExternalAccessToken); if (verifiedAccessToken == null) { return(BadRequest("Invalid Provider or External Access Token")); } User user = await usersService.FindAsync(new UserLoginInfo(model.Provider, verifiedAccessToken.user_id)); bool hasRegistered = user != null; if (hasRegistered) { return(BadRequest("External user is already registered")); } user = usersService.GetNewUser(model.UserName, model.Email); IdentityResult result = await usersService.CreateAsync(user); if (!result.Succeeded) { return(BadRequest(string.Join("\n", result.Errors))); } badgesService.AddInitialBadge(user); var info = new ExternalLoginInfo() { DefaultUserName = model.UserName, Login = new UserLoginInfo(model.Provider, verifiedAccessToken.user_id) }; result = await usersService.AddLoginAsync(user.Id, info.Login); if (!result.Succeeded) { return(BadRequest(string.Join("\n", result.Errors))); } var accessTokenResponse = usersService.GenerateLocalAccessTokenResponse(model.UserName, user.Id); return(Ok(accessTokenResponse)); }