public async Task <IActionResult> CheckAddress(string address) { IncomingServerToken serverToken = await _repository.GetIncomingServerTokenByNameAsync(address); if (serverToken == null) { return(Ok()); } return(Conflict()); }
// Retrieves the token and adds the user to the database public async Task <Result <User> > AuthenticateUser(string address, string token) { // Finds server ID, and returns failure if none found IncomingServerToken server = await _repository.GetIncomingServerTokenByNameAsync(address); if (server == null) { return(Result.Fail <User>("Invalid address", 400)); } // Checks tokens, and returns failure if invalid Result <CrossConnectionUser> result = await _client.AuthenticateToken(server.CrossConnectionAddress, token); if (result.Failure) { return(Result.Fail <User>(result.Error, result.Code)); } // Finds user and returns if no null, otherwise creates new user User user = await _repository.GetRemoteUserAsync(server.IncomingServerTokenID, result.Value.Username); if (user != null) { return(Result.Ok(user)); } // Creates new user and adds to database User newUser = new User() { Username = result.Value.Username, Email = result.Value.Email, ServerID = server.IncomingServerTokenID, SignupDate = DateTime.Now }; Result signUpResult = await _repository.SignupAsync(newUser); await _repository.SaveChangesAsync(); if (signUpResult.Failure) { return(Result.Fail <User>(signUpResult.Error, signUpResult.Code)); } return(Result.Ok(newUser)); }
// Returns true if the token is valid, else false private async Task <AuthenticateResult> verifyToken(string token) { IncomingServerToken serverToken = await _repository.GetIncomingServerTokenByValueAsync(token); if (serverToken == null) { return(AuthenticateResult.Fail("Unauthorized")); } List <Claim> claims = new List <Claim>() { new Claim(ClaimTypes.NameIdentifier, serverToken.Address), }; ClaimsIdentity identity = new ClaimsIdentity(claims, Scheme.Name); ClaimsPrincipal principal = new ClaimsPrincipal(identity); AuthenticationTicket ticket = new AuthenticationTicket(principal, Scheme.Name); return(AuthenticateResult.Success(ticket)); }
public async Task <IActionResult> RegisterIncomingToken(RegisterTokenRequest request) { // Retrieves the urls of the services of the instance, and returns error if unsuccessful Result <ServerURLs> urlResult = await SimpleForumClient.GetServerURLs(request.Address); if (urlResult.Failure) { return(StatusCode(urlResult.Code, urlResult.Error)); } // Adds the token to checks it is valid IncomingServerToken token = new IncomingServerToken() { Address = request.Address, ApiAddress = urlResult.Value.APIURL, CrossConnectionAddress = urlResult.Value.CrossConnectionURL, Token = request.Token }; Result addResult = await _repository.AddIncomingServerToken(token); if (addResult.Failure) { return(StatusCode(addResult.Code, addResult.Error)); } Result checkResult = await _crossConnectionClient.CheckToken(token.CrossConnectionAddress, request.Token); // Returns error if token is invalid, otherwise saves changes if (checkResult.Failure) { return(StatusCode(checkResult.Code, checkResult.Error)); } await _repository.SaveChangesAsync(); return(Ok()); }