Пример #1
0
        /// <summary>
        /// Builds the full Uri for requesting authorization decisions for the given <paramref name="authorizedItems"/>.
        /// </summary>
        /// <param name="authorizedItems">Items for which authorization decisions are requested.</param>
        /// <param name="responseType">The response format to request.</param>
        /// <param name="consume"><c>true</c> to consume a license, <c>false</c> to only check if authorization is granted or denied.</param>
        /// <param name="consumptionMode">Consumption mode: <see cref="ConsumptionMode.Cache"/> for short-term consumption by online clients,
        /// <see cref="ConsumptionMode.Checkout"/> for longer term consumption by clients that may go offline.</param>
        /// <param name="additionalClaims">List of additional license consumption claims.
        /// If <c>null</c> or empty, no additional claims are used.</param>
        /// <returns>Uri for the authorization decision request.</returns>
        protected Uri BuildCheckOrConsumeUri(
            IList <string> authorizedItems,
            ResponseType responseType,
            bool consume,
            ConsumptionMode consumptionMode = ConsumptionMode.Cache,
            IList <KeyValuePair <string, string> > additionalClaims = null)
        {
            if (AuthzApiConfig == null)
            {
                throw new InvalidOperationException("AuthzApiConfig must be specified");
            }

            if (AuthzApiConfig.EndpointUri == null)
            {
                throw new InvalidOperationException("AuthzApiConfig.EndpointUri must be specified");
            }

            var uriBuilder = new UriBuilder(AuthzApiConfig.EndpointUri);
            var query      = HttpUtility.ParseQueryString(uriBuilder.Query);

            foreach (var authorizedItem in authorizedItems)
            {
                query[authorizedItem] = null;
            }

            query["doConsume"]       = consume ? "true" : "false";
            query["consumptionMode"] = consumptionMode == ConsumptionMode.Checkout ? "checkout" : "cache";

            if (ComputerId != null)
            {
                query["hw"] = ComputerId;
            }

            if (additionalClaims != null)
            {
                foreach (var additionalClaim in additionalClaims)
                {
                    query[additionalClaim.Key] = additionalClaim.Value;
                }
            }

            if (responseType != null)
            {
                uriBuilder.Path += responseType.Extension;
            }

            uriBuilder.Query = query.ToString();

            return(uriBuilder.Uri);
        }
Пример #2
0
        /// <summary>
        /// Sends a request to the <c>/authz/</c> endpoint for getting authorization decisions. The request
        /// may only check for authorizations, or it may consume licenses.
        /// </summary>
        /// <param name="authorizedItems">Names of the items for which authorization is requested.</param>
        /// <param name="responseType">The <see cref="ResponseType"/> requested from the server, or <c>null</c> for server default.</param>
        /// <param name="consume"><c>true</c> to consume a license, <c>false</c> otherwise.</param>
        /// <param name="consumptionMode">Consumption mode: <see cref="ConsumptionMode.Cache"/> for short-term consumption by online clients,
        /// <returns><see cref="AuthorizationDecision"/> object representing the authorization decision response from the server.</returns>
        public async Task <IList <AuthorizationDecision> > CheckOrConsumeAsync(
            IList <string> authorizedItems,
            bool consume = false,
            ResponseType responseType       = null,
            ConsumptionMode consumptionMode = ConsumptionMode.Cache)
        {
            var authzDecisionRequestUri = BuildCheckOrConsumeUri(
                authorizedItems,
                responseType,
                consume,
                consumptionMode);
            var method       = consume ? HttpMethod.Post : HttpMethod.Get;
            var responseData = await SendAuthorizationRequestAsync(authzDecisionRequestUri, method);

            var responseBody        = responseData.Key;
            var responseContentType = responseData.Value;

            return(AuthorizationDecision.FromServerResponse(authorizedItems, responseBody, responseContentType, AuthzApiConfig.SignerKey));
        }
Пример #3
0
        /// <summary>
        /// Sends a request to the <c>/authz/</c> endpoint for getting an authorization decision. This authorization decision
        /// may only check for authorization, or it may consume a license.
        /// </summary>
        /// <param name="authorizedItem">Name of the item for which authorization is requested.</param>
        /// <param name="responseType">The <see cref="ResponseType"/> requested from the server, or <c>null</c> for server default.</param>
        /// <param name="consume"><c>true</c> to consume a license, <c>false</c> otherwise.</param>
        /// <param name="consumptionMode">Consumption mode: <see cref="ConsumptionMode.Cache"/> for short-term consumption by online clients,
        /// <see cref="ConsumptionMode.Checkout"/> for longer term consumption by clients that may go offline.</param>
        /// <param name="additionalClaims">List of additional license consumption claims.
        /// If <c>null</c> or empty, no additional claims are used.</param>
        /// <returns><see cref="AuthorizationDecision"/> object representing the authorization decision response from the server.</returns>
        public async Task <AuthorizationDecision> CheckOrConsumeAsync(
            string authorizedItem,
            bool consume = false,
            ResponseType responseType       = null,
            ConsumptionMode consumptionMode = ConsumptionMode.Cache,
            IList <KeyValuePair <string, string> > additionalClaims = null)
        {
            var authzDecisionRequestUri = BuildCheckOrConsumeUri(
                new string[] { authorizedItem },
                responseType,
                consume,
                consumptionMode,
                additionalClaims);
            var method       = consume ? HttpMethod.Post : HttpMethod.Get;
            var responseData = await SendAuthorizationRequestAsync(authzDecisionRequestUri, method);

            var responseBody        = responseData.Key;
            var responseContentType = responseData.Value;

            return(AuthorizationDecision.FromServerResponse(authorizedItem, responseBody, responseContentType, AuthzApiConfig.SignerKey));
        }