14

I didn't get exactly how NSwag interact with IdentityServerX bearer tokens and adds it request header conventionally? My host api application implements IdentityServer3 with LDAP auth, so as far as i understand; if any host needs to a token for authentication then any client must send it on request header. So how can i deal with it while working NSwag clients ?

Any idea appreciated. Thanks.

Oğuzhan Soykan
  • 2,072
  • 1
  • 15
  • 30

3 Answers3

20

@oguzhan-soykan and @peter answers are both good - Here's an expansion of @peter's answer to show how you can implement a base class and not repeat yourself for every API client.

Requirements

  • NSwag.MSBuild package
  • Swagger .JSON definition

Create a base 'Client' class that exposes the functionality you need. Likely a bearer token property.

public abstract class MySwaggerClientBase
{
    public string BearerToken { get; private set; }

    public void SetBearerToken(string token)
    {
        BearerToken = token;
    }

    // Called by implementing swagger client classes
    protected Task<HttpRequestMessage> CreateHttpRequestMessageAsync(CancellationToken cancellationToken)
    {
        var msg = new HttpRequestMessage();
        // SET THE BEARER AUTH TOKEN
        msg.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", BearerToken);
        return Task.FromResult(msg);
    }

}

Edit your swagger code generation command to make use of the base class for all generated clients and use the UseHttpRequestMessageCreationMethod option.

<Project>
 ...
<Exec Command="$(NSwagExe) swagger2csclient /input:path-to-swagger-definition.json /output:$(ProjectDir)\Swagger.generated.cs /Namespace:MyNameSpace /ClientBaseClass:MySwaggerClientBase /UseHttpRequestMessageCreationMethod:true" />
 ...
</Project>
Aaron Hudon
  • 3,765
  • 1
  • 40
  • 46
17

I've resolved the issue by partial method. My example is:

CampaignClient.cs

public partial class CampaignClient
{
    partial void PrepareRequest(HttpClient request, ref string url);

    partial void ProcessResponse(HttpClient request, HttpResponseMessage response);

    //some codes...
}

CampaignClient.Extensions.cs - partial class:

public partial class CampaignClient
{
    private readonly IRequestContext _requestContext;
    private readonly IStartupConfiguration _startupConfiguration;

    public CampaignClient(IRequestContext requestContext, IStartupConfiguration startupConfiguration)
    {
        _requestContext = requestContext;
        _startupConfiguration = startupConfiguration;
    }

    partial void PrepareRequest(HttpClient request, ref string url)
    {
        request.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _requestContext.GetBearerTokenOrTriggerUnauthException());
    }
}

Method override has saved me!

Oğuzhan Soykan
  • 2,072
  • 1
  • 15
  • 30
  • This way will become useless if you have more than a dozen classes in your API, You should use the base class to handle your httpClient object used in the request. Additionally, you should take into consideration the automated token prolongation on the first recipient of 401 status. I will put a detailed answer the soon possible time – AbuDawood Sep 05 '20 at 17:01
7

For the c# client you can specifcy UseHttpClientCreationMethodor UseHttpRequestMessageCreationMethod

(Cf. https://github.com/RicoSuter/NSwag/blob/master/src/NSwag.CodeGeneration.CSharp/SwaggerToCSharpClientGeneratorSettings.cs)

That way NSwag expects you to implement the methods for Creating A HttpClient or HttpRequest. You can set your headers there without any magic

mihkov
  • 983
  • 9
  • 34
Peter
  • 1,267
  • 12
  • 18
  • how can you use this for the SwaggerUi ? –  Sep 15 '17 at 08:20
  • this is an option for the swagger client generator. the swagger ui is a different thing as far as I know. Could be that the swagger ui is generated using a client generator, but I'm not sure. Maybe make this a question – Peter Sep 15 '17 at 14:04
  • https://stackoverflow.com/questions/46236152/implement-jwtbearer-authentication-in-nswag-swaggerui @Peter –  Sep 15 '17 at 14:11