コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }