Search code examples
c#asp.net-coreidentitymodel

getting 401 unauthorize while using IdentityModel.AspNetCore -1.0.0-rc.4.1


I am trying to access a protected API using client credential flow in my asp.net core 3.1 application.

For token management I am using IdentityModel.AspNetCore -1.0.0-rc.4.1.

 public void ConfigureServices(IServiceCollection services)
 {
     services.AddHttpClient<ApiService>(client =>
     {
         client.BaseAddress = new Uri("http://localhost:10811/");
     })
     .AddClientAccessTokenHandler();

     services.AddAccessTokenManagement(options =>
     {
        options.Client.Clients.Add("auth", new ClientCredentialsTokenRequest
        {
           Address = "http://localhost:10811/token",
           ClientId = "client1",
           ClientSecret = "Supersecret"
        });
    });
}

I am always getting 401 while trying to access the protected API service.

ApiService code,

public class ApiService
{
    public HttpClient HttpClient;

    public ApiService(HttpClient client)
    {
        HttpClient = client;
    }

    public async Task<string> GetContactsAsync()
    {
        var response = await HttpClient.GetAsync("http://localhost:10811/test");
        response.EnsureSuccessStatusCode();
        return "Done";
    }
}

And here I am calling

public class MyCallService
{
    private readonly IHttpClientFactory _clientFactory;

    public MyCallService(IHttpClientFactory clientFactory)
    {
        if (clientFactory != null) 
            _clientFactory = clientFactory;
    }

    public void Call()
    {
       var client = _clientFactory.CreateClient();

       var apiService= new ApiService(client);

       await apiService.GetContactsAsync();
    }
}

Is the above code setting any token, what I am missing here?
Where to put Bearer token in the authorization header.


Solution

  • In order to send the token with any request from the httpclient , you need to inject it before and to do that you need to use AddClientAccessTokenClient method under the AddAccessTokenManagement

    services.AddClientAccessTokenClient("client", configureClient: client =>
    {
        client.BaseAddress = new Uri("http://localhost:10811/");
    });
    

    and you need to specifiy the name of the config to use in order to create httpclient

    _client = factory.CreateClient("client");
    

    and now you can simply call

    var response = await HttpClient.GetAsync("test"); //no need to specify the full URL