コード例 #1
0
        public void CreateToken()
        {
            TokenClaim  claim   = CreateClaim();
            TestPayload payload = CreatePayload();

            CreateToken(claim, payload);
        }
コード例 #2
0
        /// <summary>
        /// <see cref="IAuthoritionTokenService.GetToken(IAuthoritionComponent)"/>
        /// </summary>
        public TokenClaim GetToken(IAuthoritionComponent component)
        {
            var feature = component.GetFeatureCode();

            //Try to remove the read-write lock from cache
            var locker = TokenCache.GetOrCreate(feature + "_locker", () => new ReaderWriterLockSlim(), null);

            TokenClaim Claim = null;

            do
            {
                Claim = locker.RetryReadWithLocker(
                    () => TokenCache.Get <TokenClaim>(feature), READ_WAIT_LIMIT, DefaultOptionManagement.MaximumNumberOfRetries);

                //Return directly if the ticket exists
                if (Claim != null && Claim.Expires.HasValue)
                {
                    return(Claim);
                }
            } while (!locker.TryEnterWriteLock(10));

            //Read and write cannot acquire the state normally in the case of asynchronous,
            //so the process of acquiring the token is executed in a synchronous blocking manner.
            Claim = Task.Run(() => GetClaimTryToCache(TokenCache, feature, component)).Result;

            locker.ExitWriteLock();

            return(Claim);
        }
コード例 #3
0
        public void CreateToken_NullClaim()
        {
            TokenClaim  claim   = null;
            TestPayload payload = CreatePayload();

            CreateToken(claim, payload);
        }
コード例 #4
0
        public async Task <TokenClaim> ApplyToken()
        {
            var content = new MultipartFormDataContent();

            foreach (var item in AuthoritionTicket)
            {
                content.Add(new StringContent(item.Value), item.Key);
            }

            var response = await DependenceInjectService.GetService <IHttpClientFactory>().SendAsync(AuthorityServer, content);

            var Claim = new TokenClaim {
                Raw = await response.Content.ReadAsStringAsync()
            };

            var json = JObject.Parse(Claim.Raw);

            Claim.Token = Credential.Invoke(json, CredentialKey);

            var ExpireSecond = ExpireTime.Invoke(json, ExpireTimeKey);

            if (ExpireSecond > 0)
            {
                Claim.Expires = DateTime.Now.AddSeconds(ExpireSecond);
            }

            return(Claim);
        }
コード例 #5
0
        public void CreateToken_NullPayload()
        {
            TokenClaim  claim   = CreateClaim();
            TestPayload payload = null;

            claim.Expiration = DateTimeOffset.UtcNow.AddSeconds(-1);

            CreateToken(claim, payload);
        }
コード例 #6
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="claim"></param>
        /// <param name="payload"></param>
        /// <returns></returns>
        private ITokenPair GetToken(TokenClaim claim, TestPayload payload)
        {
            MsJwtProviderBase <TestPayload> provider = new TestMsJwtRS256Provider().CreateProvider();

            TokenInfo accessToken = new TokenInfo(provider.CreateToken(claim, payload), claim.Expiration, claim.NotBefore);

            claim.Expiration = DateTimeOffset.UtcNow.AddSeconds(TestConstants.RefreshTokenLifetimeSeconds);

            TokenInfo refreshToken = new TokenInfo(provider.CreateToken(claim, payload), claim.Expiration, claim.NotBefore);

            return(new TokenPair(accessToken, refreshToken));
        }
コード例 #7
0
        public void CreateToken_NotBefore()
        {
            TokenClaim  claim   = TestMsJwtProviderBase.CreateClaim();
            TestPayload payload = TestMsJwtProviderBase.CreatePayload();

            claim.NotBefore = DateTimeOffset.UtcNow.AddSeconds(5);

            string token = GetProvider().CreateToken(claim, payload);

            MsJwtValidatorBase <TestPayload> validator = CreateValidator(TestConstants.Issuer, TestConstants.Audience);

            Assert.IsFalse(validator.ValidateToken(token, out ITokenClaim tokenClaim, out TestPayload tokenPayload, out TokenState state, out string errorMessage));

            Assert.AreEqual(state, TokenState.NotBefore);
        }
コード例 #8
0
        public void CreateToken_NullPayload()
        {
            TokenClaim  claim   = TestMsJwtProviderBase.CreateClaim();
            TestPayload payload = null;

            string token = GetProvider().CreateToken(claim, payload);

            MsJwtValidatorBase <TestPayload> validator = CreateValidator(TestConstants.Issuer, TestConstants.Audience);

            Assert.IsTrue(validator.ValidateToken(token, out ITokenClaim tokenClaim, out TestPayload tokenPayload, out TokenState state, out string errorMessage));

            Assert.IsTrue(ValueEquals(claim, tokenClaim));
            Assert.IsNull(tokenPayload);
            Assert.AreEqual(state, TokenState.Valid);
        }
コード例 #9
0
		public async Task<TokenClaim> ApplyToken()
		{
			TimeSpan spend = DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
			if (Mode == GAMode.RemoteAccess)
			{
				var response = await DependenceInjectService.GetService<IHttpClientFactory>().SendAsync(AuthorityServer, null, HttpMethod.Get);
				var Claim = new TokenClaim();
				Claim.Raw = Claim.Token = await response.Content.ReadAsStringAsync();
				Claim.Expires = DateTime.Now.AddSeconds(spend.TotalSeconds % ExpireSecond);
				return Claim;
			}
			else if (Mode == GAMode.Generation)
				return GetCodeInternal(SecretKey, spend);
			else
				throw new NotSupportedException("The authentication component has not been initialized yet. Please set the server address or Secretkey.");
		}
コード例 #10
0
		private TokenClaim GetCodeInternal(string secret, TimeSpan spend)
		{
			var Claim = new TokenClaim();
			var Second = (ulong)ExpireSecond;

			ulong chlg = (ulong)(spend.TotalSeconds / Second);
			Claim.Expires = DateTime.Now.AddSeconds(spend.TotalSeconds % Second);


			byte[] challenge = new byte[8];
			for (int j = 7; j >= 0; j--)
			{
				challenge[j] = (byte)((int)chlg & 0xff);
				chlg >>= 8;
			}

			var key = Base32ToBytes(secret);
			for (int i = secret.Length; i < key.Length; i++)
			{
				key[i] = 0;
			}

			HMACSHA1 mac = new HMACSHA1(key);
			var hash = mac.ComputeHash(challenge);

			int offset = hash[hash.Length - 1] & 0xf;

			int truncatedHash = 0;
			for (int j = 0; j < 4; j++)
			{
				truncatedHash <<= 8;
				truncatedHash |= hash[offset + j];
			}

			truncatedHash &= 0x7FFFFFFF;
			truncatedHash %= 1000000;

			string code = truncatedHash.ToString();
			Claim.Raw = Claim.Token = code.PadLeft(6, '0');

			return Claim;
		}
コード例 #11
0
        /// <summary>
        ///
        /// </summary>
        private void CreateToken_InvalidAudience(bool validateAudience)
        {
            TokenClaim  claim   = TestMsJwtProviderBase.CreateClaim();
            TestPayload payload = TestMsJwtProviderBase.CreatePayload();

            string token = GetProvider().CreateToken(claim, payload);

            MsJwtValidatorBase <TestPayload> validator = CreateValidator(TestConstants.Issuer, validateAudience ? "thisAudience" : null);

            if (validateAudience)
            {
                Assert.IsFalse(validator.ValidateToken(token, out ITokenClaim tokenClaim, out TestPayload tokenPayload, out TokenState state, out string errorMessage));
                Assert.AreEqual(state, TokenState.InvalidAudience);
            }
            else
            {
                Assert.IsTrue(validator.ValidateToken(token, out ITokenClaim tokenClaim, out TestPayload tokenPayload, out TokenState state, out string errorMessage));
                Assert.AreEqual(state, TokenState.Valid);
            }
        }
コード例 #12
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="secondsBefore"></param>
        /// <returns></returns>
        private TokenManager CreateRefresher(int secondsBefore)
        {
            return(new TokenManager(token =>
            {
                if (!m_Validator.ValidateToken(token, out ITokenClaim claim, out TestPayload payload, out TokenState state, out string errorMessage))
                {
                    throw new ArgumentException(errorMessage);
                }

                TokenClaim newClaim = new TokenClaim()
                {
                    JwtID = claim.JwtID,
                    Audience = claim.Audience,
                    Expiration = DateTimeOffset.UtcNow.AddSeconds(TestConstants.AccessTokenLifetimeSeconds),
                };

                return GetToken(newClaim, payload);
            }
                                    , secondsBefore
                                    ));
        }
コード例 #13
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="claim"></param>
        /// <param name="payload"></param>
        /// <returns></returns>
        public string CreateToken(TokenClaim claim, TestPayload payload)
        {
            MsJwtProviderBase <TestPayload> provider = CreateProvider();

            return(provider.CreateToken(claim, payload));
        }
コード例 #14
0
 public void AuthorizeFormSetting(MultipartFormDataContent Content, TokenClaim Claim)
 {
     Content.Add(new StringContent(Claim.Token), "auth_token");
 }
コード例 #15
0
 public void AuthorizeFormSetting(MultipartFormDataContent content, TokenClaim claim)
 {
     throw new NotImplementedException();
 }
コード例 #16
0
		public void AuthorizeFormSetting(MultipartFormDataContent content, TokenClaim Token)
		{
			content.Add(new StringContent(Token.Token), "auth_token");
		}