Пример #1
0
        /// <summary>
        /// Returns an access token for the standard client or a named client
        /// </summary>
        /// <param name="httpContext">The HTTP context</param>
        /// <param name="clientName">Name of the client configuration (or null to use the standard client).</param>
        /// <param name="parameters"></param>
        /// <param name="cancellationToken">A cancellation token to cancel operation.</param>
        /// <returns></returns>
        public static async Task<string> GetClientAccessTokenAsync(
            this HttpContext httpContext,
            string clientName = AccessTokenManagementDefaults.DefaultTokenClientName,
            ClientAccessTokenParameters parameters = null,
            CancellationToken cancellationToken = default)
        {
            var service = httpContext.RequestServices.GetRequiredService<IClientAccessTokenManagementService>();

            return await service.GetClientAccessTokenAsync(clientName, parameters, cancellationToken);
        }
        public async Task ClientAccessTokenParameters_should_propagate()
        {
            var handler = new NetworkHandler();

            void options(ClientAccessTokenManagementOptions o)
            {
                o.Clients.Add("test", new ClientCredentialsTokenRequest
                {
                    Address  = "https://test",
                    ClientId = "test"
                });
            }

            var service = Setup.ClientCollection(options, handler)
                          .BuildServiceProvider()
                          .GetRequiredService <IClientAccessTokenManagementService>();

            var parameters = new ClientAccessTokenParameters
            {
                Resource = "urn:resource",
                Context  =
                {
                    { "context_item", "context_value" }
                }
            };

            var result = await service.GetClientAccessTokenAsync(parameters : parameters);

            var requestContent = await handler.Content.ReadAsStringAsync();

            requestContent.Should().Contain("resource=urn%3Aresource");

            #if NET5_0_OR_GREATER
            parameters = handler.Options.SingleOrDefault(o => o.Key == AccessTokenManagementDefaults.AccessTokenParametersOptionsName).Value
                         as ClientAccessTokenParameters;
            #else
            var properties = handler.Properties;
            parameters =
                properties[AccessTokenManagementDefaults.AccessTokenParametersOptionsName] as
                ClientAccessTokenParameters;
            #endif

            parameters.Should().NotBeNull();
            parameters.Context["context_item"].First().Should().Be("context_value");
        }