Beispiel #1
0
        public async Task <Result <byte[]> > BuildAsync(IAsymmetricHasher hasher)
        {
            var header  = Serialize(Header);
            var payload = Serialize(Claims);
            var data    = new byte[header.Length + 1 + payload.Length];

            Buffer.BlockCopy(header, 0, data, 0, header.Length);
            data[header.Length] = (byte)'.';
            Buffer.BlockCopy(payload, 0, data, header.Length + 1, payload.Length);

            var alg    = SHA256.Create();
            var digest = alg.ComputeHash(data);

            var result = await hasher.SignAsync(digest);

            if (result.IsFailure)
            {
                return(result);
            }

            var signature       = result.Value;
            var base64Signature = new byte[Base64.GetMaxEncodedToUtf8Length(signature.Length)];

            Base64.EncodeToUtf8(signature, base64Signature, out _, out _);

            var token = new byte[data.Length + 1 + base64Signature.Length];

            Buffer.BlockCopy(data, 0, token, 0, data.Length);
            token[data.Length] = (byte)'.';
            Buffer.BlockCopy(base64Signature, 0, token, data.Length + 1, base64Signature.Length);

            return(token);
Beispiel #2
0
        public async Task <Result> VerifyAsync(IAsymmetricHasher hasher)
        {
            var(success, _, (data, signature), error) = Scan();
            if (!success)
            {
                return(Result.Failure(error));
            }

            var result = await hasher.VerifyAsync(data, signature);

            if (result.IsFailure)
            {
                return(result);
            }

            var now = DateTime.UtcNow.Unix();

            if (ExpiryTimestamp.HasValue && ExpiryTimestamp.Value <= now)
            {
                return(Result.Failure(ExpiredMessage));
            }

            if (NotBeforeTimestamp.HasValue && NotBeforeTimestamp.Value > now)
            {
                return(Result.Failure(NotYetValidMessage));
            }

            return(Result.Success());
        }
Beispiel #3
0
 public TokenService(
     IUserProvider userProvider,
     IPasswordService passwordService,
     IAsymmetricHasher hasher,
     ILogger <TokenService> logger)
 {
     _userProvider    = userProvider;
     _passwordService = passwordService;
     _hasher          = hasher;
     _logger          = logger;
 }