public async Task <int> FindUserByKey(string token) { var bestBefore = DateTime.UtcNow - KEY_EXPIRATION; var account = await appDBContext_.RetryTransactionFuncAsync(5, async (db, tr) => { var session = await(from sessionToken in appDBContext_.SingleAccessKeys where sessionToken.Key == token && sessionToken.Used == null && sessionToken.Issued > bestBefore select sessionToken) .FirstOrDefaultAsync(); if (session == null) { return(TransactionResult.Done <object>(null)); } session.Used = DateTime.UtcNow; await db.SaveChangesAsync(); return(TransactionResult.Done <object>(session.AccountId)); }, (db, tr, c) => Task.FromResult(TransactionResult.Retry <object>()), (db) => Task.FromResult((object)null) ); if (account == null) { throw new AccountNotFoundException($"SA token not found or expired"); } return((int)account); }
public async Task <string> CreateKey(int accountId) { if (accountId <= 0) { throw new InvalidArgumentException($"Invalid user id"); } var key = await appDBContext_.RetryTransactionFuncAsync(5, async (db, tr) => { var token = GenerateToken(); await db.SingleAccessKeys.AddAsync(new DBSingleAccessKey { AccountId = accountId, Key = token, Issued = DateTime.UtcNow, }); await db.SaveChangesAsync(); return(TransactionResult.Done <string>(token)); }, (db, tr, c) => Task.FromResult(TransactionResult.Retry <string>()), (db) => Task.FromResult("") ); if (string.IsNullOrEmpty(key)) { throw new HttpStatusErrorException(HttpStatusCode.Conflict, $"Failed to create SA token"); } return(key); }
public async Task <string> CreateToken(int accountId, SiteInfo siteInfo, CredentialType credential) { if (accountId <= 0) { throw new InvalidArgumentException($"Invalid user id"); } var key = await appDBContext_.RetryTransactionFuncAsync(5, async (db, tr) => { var token = GenerateToken(); await db.SessionTokens.AddAsync(new DBSessionToken { AccountId = accountId, Credential = credential, Token = token, UserAgent = siteInfo.UserAgent ?? "", Ip = siteInfo.Ip, Country = siteInfo.Country, Issued = DateTime.UtcNow, }); await db.SaveChangesAsync(); return(TransactionResult.Done <string>(token)); }, (db, tr, c) => Task.FromResult(TransactionResult.Retry <string>()), (db) => Task.FromResult("") ); if (string.IsNullOrEmpty(key)) { throw new HttpStatusErrorException(HttpStatusCode.Conflict, $"Failed to generate login key"); } return(key); }
public async Task <int> RefreshToken(string token, SiteInfo siteInfo) { var account = await appDBContext_.RetryTransactionFuncAsync(5, async (db, tr) => { var session = await(from sessionToken in appDBContext_.SessionTokens where sessionToken.Token == token && sessionToken.Revoked == null select sessionToken) .FirstOrDefaultAsync(); if (session == null) { return(TransactionResult.Done <object>(null)); } if (!session.Check(siteInfo)) { session.Revoked = DateTime.UtcNow; await db.SaveChangesAsync(); return(TransactionResult.Done <object>(null)); } session.LastRefreshed = DateTime.UtcNow; session.RefreshCount += 1; await db.SaveChangesAsync(); return(TransactionResult.Done <object>(session.AccountId)); }, (db, tr, c) => Task.FromResult(TransactionResult.Retry <object>()), (db) => Task.FromResult((object)null) ); if (account == null) { throw new AccountNotFoundException($"Token not found or expired"); } return((int)account); }
public async Task <SessionToken> FindSessionTokenByUser(int account, SiteInfo siteInfo) { var token = await appDBContext_.RetryTransactionFuncAsync(5, async (db, tr) => { var session = await(from sessionToken in appDBContext_.SessionTokens where sessionToken.AccountId == account && sessionToken.Revoked == null select sessionToken) .FirstOrDefaultAsync(); if (session == null) { return(TransactionResult.Done <object>(null)); } if (!session.Check(siteInfo)) { session.Revoked = DateTime.UtcNow; await db.SaveChangesAsync(); return(TransactionResult.Done <object>(null)); } return(TransactionResult.Done <object>(new SessionToken { Token = session.Token, CredentialType = session.Credential })); }, (db, tr, c) => Task.FromResult(TransactionResult.Retry <object>()), (db) => Task.FromResult((object)null) ); if (token == null) { throw new AccountNotFoundException($"Account not found or its token is expired"); } return((SessionToken)token); }