Goran
Goran

Reputation: 1012

Azure publish: Failed to update API in Azure

Im trying to publish my .net3.1 webapp on Azure from Visual Studio.

Visual studio fails on 'Starting to update your API' step, this is the output from visual studio:

Build started...
1>------ Build started: Project: WebApplication_XXX, Configuration: Release Any CPU ------
1>WebApplication_XXX -> C:\Users\YYYY\source\repos\WebApplication_XXX\WebApplication_XXX\bin\Release\netcoreapp3.1\WebApplication_XXX.dll
1>Done building project "WebApplication_XXX.csproj".
2>------ Publish started: Project: WebApplication_XXX, Configuration: Release Any CPU ------
WebApplication_XXX -> C:\Users\YYYY\source\repos\WebApplication_XXX\WebApplication_XXX\bin\Release\netcoreapp3.1\WebApplication_XXX.dll
npm install
npm run build -- --prod
> [email protected] build C:\Users\YYYY\source\repos\WebApplication_XXX\WebApplication_XXX\ClientApp
> ng build "--prod"

Generating ES5 bundles for differential loading...
ES5 bundle generation complete.
....
Publish Succeeded.
Web App was published successfully https://xxxxxxx.azurewebsites.net/
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
========== Publish: 1 succeeded, 0 failed, 0 skipped ==========
Starting to update your API
Generating swagger file to 'C:\Users\YYYY\source\repos\WebApplication_XXX\WebApplication_XXX\bin\Release\netcoreapp3.1\swagger.json'.
Failed to update your API in Azure.

I then check Azure portal and find some error in 'Create API or Update API' json

...
"properties": {
    "statusCode": "BadRequest",
    "serviceRequestId": "*****",
    "statusMessage": "{\"error\":{\"code\":\"ValidationError\",\"message\":\"One or more fields contain incorrect values:\",\"details\":[{\"code\":\"ValidationError\",\"target\":\"representation\",\"message\":\"Parsing error(s): JSON is valid against no schemas from 'oneOf'. Path 'securityDefinitions.Bearer', line 2841, position 15.\"},{\"code\":\"ValidationError\",\"target\":\"representation\",\"message\":\"Parsing error(s): The input OpenAPI file is not valid for the OpenAPI specificate https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md (schema https://github.com/OAI/OpenAPI-Specification/blob/master/schemas/v2.0/schema.json).\"}]}}",
    "eventCategory": "Administrative",
    "entity": "/subscriptions/*****/resourceGroups/XXX/providers/Microsoft.ApiManagement/service/WebApplicationXXXapi/apis/WebApplicationXXX",
    "message": "Microsoft.ApiManagement/service/apis/write",
    "hierarchy": "*****"
},
...

So I open the generated swagger.json file from 'C:\Users\YYYY\source\repos\WebApplication_XXX\WebApplication_XXX\bin\Release\netcoreapp3.1\swagger.json' in swagger editor and get the same error:

Structural error at securityDefinitions.Bearer
should have required property 'type'
missingProperty: type

because the Security Definitions Bearer is empty in the json file

securityDefinitions:
  Bearer: {
  }

if I make the following change in in the swagger editor it gets happy:

securityDefinitions:
  Bearer: {
    type: apiKey,
    name: "JWT Authentication",
    in: "header"
  }

In my application Startup.cs I got:

services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "XXX API", Version = "v1" });
    var securityScheme = new OpenApiSecurityScheme
    {
        Name = "JWT Authentication",
        Description = "Enter JWT Bearer token **_only_**",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.Http,
        Scheme = "bearer", // must be lower case
        BearerFormat = "JWT",
        Reference = new OpenApiReference
        {
            Id = JwtBearerDefaults.AuthenticationScheme,
            Type = ReferenceType.SecurityScheme
        }
    };
    c.AddSecurityDefinition(securityScheme.Reference.Id, securityScheme);
    c.AddSecurityRequirement(new OpenApiSecurityRequirement
    {
        {securityScheme, new string[] { }}
    });
});

what is it Im missing? Shouldnt the code in Startup.cs add the securityDefinition when generating the swagger.json file?

Upvotes: 1

Views: 3314

Answers (3)

matthew roxburgh
matthew roxburgh

Reputation: 31

Not sure if this is going to be applicable for everyone and it's using different markup but I found I got this issue when I have a path parameter of a class type.

This fails

[OpenApiParameter(name: "countryCode", Type = typeof(Country), In = ParameterLocation.Path, Summary = "Country for the customer", Description =` "Must be a valid country, eg UK")]

This works but is not what I want as string is too generic.

[OpenApiParameter(name: "countryCode", Type = typeof(string), In = ParameterLocation.Path, Summary = "Country for the customer", Description =` "Must be a valid country, eg UK")]

The solution was the adding the Required attribute.

[OpenApiParameter(name: "countryCode", Type = typeof(Country), In = ParameterLocation.Path, Summary = "Country for the customer", Description =` "Must be a valid country, eg UK", Required = true)]

Upvotes: 0

ulm
ulm

Reputation: 61

We have the same problem. For now we have used a workaround with disabling update the api during publish. (I use VS2022 and .net6.0)
In the PublishProfiles/...pubxml change the parameter UpdateApiOnPublish to false.

<UpdateApiOnPublish>false</UpdateApiOnPublish>

Upvotes: 6

SauravDas-MT
SauravDas-MT

Reputation: 1440

Can you check if there is any target framework missing also check your NuGet packages dependency.

JwtSecurityTokenHandler class which generated a token needs to be implemented. To understand the correct workflow for JWT implementation check this JWT Authentication Tutorial with Example API.

Upvotes: -1

Related Questions