コード例 #1
0
        public async Task SaveTokenSet(string athleteId, string accessToken, string refreshToken, DateTime accessTokenExpiresAtUtc)
        {
            AccessTokenTableEntity byAthelete = new AccessTokenTableEntity
            {
                AccessToken               = accessToken,
                AccessTokenExpiryUtc      = accessTokenExpiresAtUtc,
                AthleteId                 = athleteId,
                PartitionKey              = AccessTokenTableEntity.GetPartitionKeyByAthleteId(athleteId),
                RefreshToken              = refreshToken,
                RefreshTokenObtainedAtUtc = DateTime.UtcNow,
                RowKey = AccessTokenTableEntity.GetRowKeyByAthleteId()
            };
            AccessTokenTableEntity byAccessToken = new AccessTokenTableEntity
            {
                AccessToken               = accessToken,
                AccessTokenExpiryUtc      = accessTokenExpiresAtUtc,
                AthleteId                 = athleteId,
                PartitionKey              = AccessTokenTableEntity.GetPartitionKeyByAccessToken(accessToken),
                RefreshToken              = refreshToken,
                RefreshTokenObtainedAtUtc = DateTime.UtcNow,
                RowKey = AccessTokenTableEntity.GetRowKeyByAccessToken()
            };

            await Task.WhenAll(
                _byAtheleteIdTable.ExecuteAsync(TableOperation.InsertOrReplace(byAthelete)),
                _byAccessTokenTable.ExecuteAsync(TableOperation.InsertOrReplace(byAccessToken))
                );
        }
コード例 #2
0
 private static RepositoryEnrichedTokenSet CreatedEnrichedTokenSet(AccessTokenTableEntity tableEntity)
 {
     return(new RepositoryEnrichedTokenSet
     {
         AthleteId = tableEntity.AthleteId,
         AccessToken = tableEntity.AccessToken,
         ExpiresAtUtc = tableEntity.AccessTokenExpiryUtc,
         RefreshToken = tableEntity.RefreshToken
     });
 }
コード例 #3
0
        public void Read_NotThrowsException_StateIsValid()
        {
            var accessTokenKey = new AccessTokenTableEntity
            {
                TokenId = "normal",
            };
            var accessTokenRepository = new AccessTokenRepository(TestEnvironment.DBSettings);
            var accessToken           = accessTokenRepository.Read(accessTokenKey);

            Assert.IsNotNull(accessToken);
        }
コード例 #4
0
        public void Update_NotThrowsException_StateIsValid()
        {
            var accessTokenKey = new AccessTokenTableEntity
            {
                TokenId = "normal",
            };
            var accessTokenRepository = new AccessTokenRepository(TestEnvironment.DBSettings);
            var accessToken           = accessTokenRepository.Read(accessTokenKey);

            accessToken.UpdateTime = DateUtil.Now;
            Assert.IsTrue(accessTokenRepository.Update(accessToken));
        }
コード例 #5
0
        public async Task <RepositoryEnrichedTokenSet> GetForAccessToken(string accessToken)
        {
            TableResult tableResult = await _byAccessTokenTable.ExecuteAsync(TableOperation.Retrieve <AccessTokenTableEntity>(
                                                                                 AccessTokenTableEntity.GetPartitionKeyByAccessToken(accessToken),
                                                                                 AccessTokenTableEntity.GetRowKeyByAccessToken()));

            if (tableResult != null)
            {
                AccessTokenTableEntity tableEntity = (AccessTokenTableEntity)tableResult.Result;
                return(CreatedEnrichedTokenSet(tableEntity));
            }

            return(null);
        }
コード例 #6
0
        public void Create_NotThrowsException_StateIsValid()
        {
            var now         = DateUtil.Now;
            var accessToken = new AccessTokenTableEntity
            {
                TokenId       = new string('X', 100),
                Name          = new string('X', 100),
                Description   = new string('X', 400),
                ApplicationId = Guid.NewGuid(),
                PrincipalType = PrincipalType.Application.ToString(),
                PrincipalId   = Guid.NewGuid(),
                Scopes        = new string('X', 8000),
                Status        = AccessTokenStatus.NORMAL.ToString(),
                ExpiryTime    = DateTimeOffset.MaxValue,
                CreateTime    = DateTimeOffset.MaxValue,
                UpdateTime    = DateTimeOffset.MaxValue,
            };
            var accessTokenRepository = new AccessTokenRepository(TestEnvironment.DBSettings);

            accessTokenRepository.Create(accessToken);
        }
コード例 #7
0
        public async Task DeleteTokenSetForAccessToken(string existingAccessToken)
        {
            TableResult byAccessTokenTableResult = await _byAtheleteIdTable.ExecuteAsync(TableOperation.Retrieve <AccessTokenTableEntity>(
                                                                                             AccessTokenTableEntity.GetPartitionKeyByAccessToken(existingAccessToken),
                                                                                             AccessTokenTableEntity.GetRowKeyByAccessToken()));

            if (byAccessTokenTableResult != null)
            {
                AccessTokenTableEntity byAccessTokenTableEntity = (AccessTokenTableEntity)byAccessTokenTableResult.Result;
                TableResult            byAthleteTableResult     = await _byAtheleteIdTable.ExecuteAsync(TableOperation.Retrieve <AccessTokenTableEntity>(
                                                                                                            AccessTokenTableEntity.GetPartitionKeyByAthleteId(byAccessTokenTableEntity.AthleteId),
                                                                                                            AccessTokenTableEntity.GetRowKeyByAthleteId()));

                if (byAthleteTableResult != null)
                {
                    AccessTokenTableEntity byAthleteTableEntity = (AccessTokenTableEntity)byAthleteTableResult.Result;
                    await _byAtheleteIdTable.ExecuteAsync(TableOperation.Delete(byAthleteTableEntity));
                }

                await _byAccessTokenTable.ExecuteAsync(TableOperation.Delete(byAccessTokenTableEntity));
            }
        }
コード例 #8
0
        /// <inheritdoc/>
        public AccessToken CreateAccessToken(Guid applicationId, Guid accountId, IList <string> scopes)
        {
            if (applicationId == null || applicationId == Guid.Empty)
            {
                throw new ArgumentNullException(nameof(applicationId));
            }

            if (accountId == null || accountId == Guid.Empty)
            {
                throw new ArgumentNullException(nameof(accountId));
            }

            var application = _applicationRepository.Read(new ApplicationTableEntity {
                ApplicationId = applicationId
            });

            if (application == null || application.Status != ApplicationStatus.NORMAL.ToString())
            {
                throw new InvalidOperationException($"Application '{applicationId}' was not found.");
            }

            var account = _accountService.GetAccount(accountId);

            if (account == null)
            {
                throw new InvalidOperationException($"Account '{accountId}' was not found.");
            }

            if (account.Person == null || account.Person.Status != PersonStatus.NORMAL)
            {
                throw new InvalidOperationException($"Account '{accountId}' was not valid.");
            }

            var            roleScopes        = GetAccountRoleScopes(account.Roles);
            IList <string> accessTokenScopes = scopes;

            if (scopes == null || scopes.Count() == 0)
            {
                accessTokenScopes = roleScopes;
            }
            else
            {
                foreach (string scope in scopes)
                {
                    if (!roleScopes.Contains(scope))
                    {
                        throw new InvalidOperationException($"Scope '{scope}' was not included in the account role scope.");
                    }
                }
            }

            var now         = DateUtil.Now;
            var accessToken = new AccessTokenTableEntity
            {
                TokenId       = StringUtil.CreateCode(),
                ApplicationId = applicationId,
                PrincipalType = PrincipalType.User.ToString(),
                PrincipalId   = accountId,
                Name          = accountId + " - " + now.ToISO8601(),
                Description   = string.Empty,
                Scopes        = JsonUtil.Serialize(accessTokenScopes),
                Status        = AccessTokenStatus.NORMAL.ToString(),
                ExpiryTime    = now.AddSeconds(_appSettings.AccessTokenExpiresIn),
                CreateTime    = now,
                UpdateTime    = now,
            };

            _accessTokenRepository.Create(accessToken);

            var result = new AccessToken
            {
                Name          = accessToken.Name,
                Description   = accessToken.Description,
                Roles         = account.Roles,
                Scopes        = JsonUtil.Deserialize <List <string> >(accessToken.Scopes),
                TokenId       = accessToken.TokenId,
                ApplicationId = accessToken.ApplicationId,
                PrincipalType = accessToken.PrincipalType,
                PrincipalId   = accessToken.PrincipalId,
                ExpiryTime    = accessToken.ExpiryTime,
                Status        = (AccessTokenStatus)Enum.Parse(typeof(AccessTokenStatus), accessToken.Status),
                CreateTime    = accessToken.CreateTime,
                UpdateTime    = accessToken.UpdateTime,
            };

            return(result);
        }