using System; using System.Net.Http; using System.Threading.Tasks; using IdentityModel.Client; using Microsoft.Extensions.Configuration; using WmsWebApi.Samples; using Volo.Abp.DependencyInjection; using Volo.Abp.IdentityModel; namespace WmsWebApi { public class ClientDemoService : ITransientDependency { private readonly ISampleAppService _sampleAppService; private readonly IIdentityModelAuthenticationService _authenticationService; private readonly IConfiguration _configuration; public ClientDemoService( ISampleAppService sampleAppService, IIdentityModelAuthenticationService authenticationService, IConfiguration configuration) { _sampleAppService = sampleAppService; _authenticationService = authenticationService; _configuration = configuration; } public async Task RunAsync() { await TestWithDynamicProxiesAsync(); await TestWithHttpClientAndIdentityModelAuthenticationServiceAsync(); await TestAllManuallyAsync(); } /* Shows how to perform an HTTP request to the API using ABP's dynamic c# proxy * feature. It is just simple as calling a local service method. * Authorization and HTTP request details are handled by the ABP framework. */ private async Task TestWithDynamicProxiesAsync() { Console.WriteLine(); Console.WriteLine($"***** {nameof(TestWithDynamicProxiesAsync)} *****"); var result = await _sampleAppService.GetAsync(); Console.WriteLine("Result: " + result.Value); result = await _sampleAppService.GetAuthorizedAsync(); Console.WriteLine("Result (authorized): " + result.Value); } /* Shows how to use HttpClient to perform a request to the HTTP API. * It uses ABP's IIdentityModelAuthenticationService to simplify obtaining access tokens. */ private async Task TestWithHttpClientAndIdentityModelAuthenticationServiceAsync() { Console.WriteLine(); Console.WriteLine($"***** {nameof(TestWithHttpClientAndIdentityModelAuthenticationServiceAsync)} *****"); //Get access token using ABP's IIdentityModelAuthenticationService var accessToken = await _authenticationService.GetAccessTokenAsync( new IdentityClientConfiguration( _configuration["IdentityClients:Default:Authority"], _configuration["IdentityClients:Default:Scope"], _configuration["IdentityClients:Default:ClientId"], _configuration["IdentityClients:Default:ClientSecret"], _configuration["IdentityClients:Default:GrantType"], _configuration["IdentityClients:Default:UserName"], _configuration["IdentityClients:Default:UserPassword"] ) ); //Perform the actual HTTP request using (var httpClient = new HttpClient()) { httpClient.SetBearerToken(accessToken); var url = _configuration["RemoteServices:WmsWebApi:BaseUrl"] + "api/WmsWebApi/sample/authorized"; var responseMessage = await httpClient.GetAsync(url); if (responseMessage.IsSuccessStatusCode) { var responseString = await responseMessage.Content.ReadAsStringAsync(); Console.WriteLine("Result: " + responseString); } else { throw new Exception("Remote server returns error code: " + responseMessage.StatusCode); } } } /* Shows how to use HttpClient to perform a request to the HTTP API. * It obtains access token using IdentityServer's API. See its documentation: * https://identityserver4.readthedocs.io/en/latest/quickstarts/2_resource_owner_passwords.html */ private async Task TestAllManuallyAsync() { Console.WriteLine(); Console.WriteLine($"***** {nameof(TestAllManuallyAsync)} *****"); //Obtain access token from the IDS4 server // discover endpoints from metadata var client = new HttpClient(); var disco = await client.GetDiscoveryDocumentAsync(_configuration["IdentityClients:Default:Authority"]); if (disco.IsError) { Console.WriteLine(disco.Error); return; } // request token var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest { Address = disco.TokenEndpoint, ClientId = _configuration["IdentityClients:Default:ClientId"], ClientSecret = _configuration["IdentityClients:Default:ClientSecret"], UserName = _configuration["IdentityClients:Default:UserName"], Password = _configuration["IdentityClients:Default:UserPassword"], Scope = _configuration["IdentityClients:Default:Scope"] }); if (tokenResponse.IsError) { Console.WriteLine(tokenResponse.Error); return; } Console.WriteLine(tokenResponse.Json); //Perform the actual HTTP request using (var httpClient = new HttpClient()) { httpClient.SetBearerToken(tokenResponse.AccessToken); var url = _configuration["RemoteServices:WmsWebApi:BaseUrl"] + "api/WmsWebApi/sample/authorized"; var responseMessage = await httpClient.GetAsync(url); if (responseMessage.IsSuccessStatusCode) { var responseString = await responseMessage.Content.ReadAsStringAsync(); Console.WriteLine("Result: " + responseString); } else { throw new Exception("Remote server returns error code: " + responseMessage.StatusCode); } } } } }