コード例 #1
0
        public static void MaybeEnvelope(this HttpResponse response, HttpRequest request, PublicApiOptions apiOptions,
                                         QueryOptions queryOptions,
                                         IPageHeader data, IList <Error> errors, out object body)
        {
            if (FeatureRequested(request, apiOptions.JsonConversion.EnvelopeOperator,
                                 apiOptions.JsonConversion.EnvelopeEnabled))
            {
                body = new EnvelopeBody
                {
                    Data    = data,
                    Status  = response.StatusCode,
                    Headers = response.Headers,
                    Paging  = new PagingInfo
                    {
                        TotalCount   = data.TotalCount,
                        TotalPages   = data.TotalPages,
                        NextPage     = GetNextPage(request, data, queryOptions),
                        PreviousPage = GetPreviousPage(request, data, queryOptions),
                        LastPage     = GetLastPage(request, data, queryOptions)
                    },
                    Errors    = errors,
                    HasErrors = errors?.Count > 0
                };

                response.StatusCode = (int)HttpStatusCode.OK;
                return;
            }

            var link = StringBuilderPool.Scoped(sb =>
            {
                if (data.TotalPages > 1)
                {
                    var firstPage = $"<{GetFirstPage(request, data, queryOptions)}>; rel=\"first\"";
                    sb.Append(firstPage);
                }

                if (data.HasNextPage)
                {
                    var nextPage = $"<{GetNextPage(request, data, queryOptions)}>; rel=\"next\"";
                    if (sb.Length > 0)
                    {
                        sb.Append(", ");
                    }

                    sb.Append(nextPage);
                }

                if (data.HasPreviousPage)
                {
                    var previousPage = $"<{GetPreviousPage(request, data, queryOptions)}>; rel=\"previous\"";
                    if (sb.Length > 0)
                    {
                        sb.Append(", ");
                    }

                    sb.Append(previousPage);
                }

                if (data.TotalPages > 1)
                {
                    var lastPage = $"<{GetLastPage(request, data, queryOptions)}>; rel=\"last\"";
                    if (sb.Length > 0)
                    {
                        sb.Append(", ");
                    }

                    sb.Append(lastPage);
                }
            });

            if (link.Length > 0)
            {
                response.Headers.Add(Constants.HttpHeaders.Link, link);
            }

            response.Headers.Add(queryOptions.TotalCountHeader, data.TotalCount.ToString());
            response.Headers.Add(queryOptions.TotalPagesHeader, data.TotalPages.ToString());
            body = new NestedBody
            {
                Data      = data,
                Errors    = errors,
                HasErrors = errors?.Count > 0
            };
        }
コード例 #2
0
 public static void MaybePrettyPrint(this HttpResponse response, HttpRequest request, PublicApiOptions options)
 {
     if (FeatureRequested(request, options.JsonConversion.PrettyPrintOperator,
                          options.JsonConversion.PrettyPrintEnabled))
     {
         request.HttpContext.Items[Constants.ContextKeys.JsonPrettyPrint] = true;
     }
 }
コード例 #3
0
        public static void MaybeEnvelope(this HttpResponse response, HttpRequest request, PublicApiOptions apiOptions,
                                         QueryOptions queryOptions, object data, IList <Error> errors, out object body)
        {
            if (FeatureRequested(request, apiOptions.JsonConversion.EnvelopeOperator,
                                 apiOptions.JsonConversion.EnvelopeEnabled))
            {
                body = new EnvelopeBody
                {
                    Data      = data,
                    Status    = response.StatusCode,
                    Headers   = response.Headers,
                    Errors    = errors,
                    HasErrors = errors?.Count > 0
                };
            }
            else
            {
                body = new NestedBody
                {
                    Data      = data,
                    Errors    = errors,
                    HasErrors = errors?.Count > 0
                };
            }

            response.StatusCode = (int)HttpStatusCode.OK;
        }
コード例 #4
0
 public static void MaybeTrim(this HttpResponse response, HttpRequest request, PublicApiOptions options)
 {
     if (FeatureRequested(request, options.JsonConversion.TrimOperator, options.JsonConversion.TrimEnabled))
     {
         request.HttpContext.Items[Constants.ContextKeys.JsonTrim] = true;
     }
 }
コード例 #5
0
ファイル: JwtSecurity.cs プロジェクト: lulzzz/HQ.Platform
        public static string CreateToken <TUser>(TUser user, IEnumerable <Claim> userClaims, SecurityOptions security, PublicApiOptions api) where TUser : IUserIdProvider
        {
            var now     = DateTimeOffset.Now;
            var expires = now.AddSeconds(security.Tokens.TimeToLiveSeconds);

            /*
             *  See: https://tools.ietf.org/html/rfc7519#section-4.1
             *  All claims are optional, but since our JSON conventions elide null values,
             *  We need to ensure any optional claims are emitted as empty strings.
             */

            // JWT.io claims:
            var sub = user.Id ?? string.Empty;
            var jti = $"{Guid.NewGuid()}";
            var iat = now.ToUnixTimeSeconds().ToString();
            var exp = expires.ToUnixTimeSeconds().ToString();
            var nbf = now.ToUnixTimeSeconds().ToString();
            var iss = security.Tokens?.Issuer ?? string.Empty;
            var aud = security.Tokens?.Audience ?? string.Empty;

            var claims = new List <Claim>
            {
                new Claim(JwtRegisteredClaimNames.Sub, sub, ClaimValueTypes.String),
                new Claim(JwtRegisteredClaimNames.Jti, jti, ClaimValueTypes.String),
                new Claim(JwtRegisteredClaimNames.Iat, iat, ClaimValueTypes.Integer64),
                new Claim(JwtRegisteredClaimNames.Nbf, nbf, ClaimValueTypes.Integer64),
                new Claim(JwtRegisteredClaimNames.Exp, exp, ClaimValueTypes.Integer64)
            };

            claims.AddRange(userClaims);

            claims.TryAddClaim(security.Claims.ApplicationIdClaim, api.ApiVersion);
            claims.TryAddClaim(security.Claims.ApplicationNameClaim, api.ApiName);

            _signing    = _signing ?? BuildSigningCredentials(security);
            _encrypting = _encrypting ?? BuildEncryptingCredentials(security);

            var handler = new JwtSecurityTokenHandler();

            if (security.Tokens.Encrypt)
            {
                var descriptor = new SecurityTokenDescriptor
                {
                    Audience = aud,
                    Issuer   = iss,
                    Subject  = new ClaimsIdentity(claims),
                    EncryptingCredentials = _encrypting
                };

                return(handler.CreateEncodedJwt(descriptor));
            }

            return(handler.WriteToken(new JwtSecurityToken(iss, aud, claims, now.UtcDateTime, expires.UtcDateTime, _signing)));
        }