Thursday, 5 September 2024

Implement Authorization in Swagger with Static Value in Header .Net 8

If you want an anonymous user should not run the APIs.
To run your API Endpoints From Swagger / Postman / Code the user should pass the header key. Follow the below steps.

We need to set up, AddSecurityDefinition and AddSecurityRequirement


Step 1: Open Program.cs, Copy and Paste code below


builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
    // Add the security requirement
    c.AddSecurityDefinition("ApiKey", new OpenApiSecurityScheme
    {
        Name = "X-api-key",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.ApiKey,
        Description = "API Key needed to access the endpoints."
    });
    // Apply the security requirement globally
    c.AddSecurityRequirement(new OpenApiSecurityRequirement
     {
         {
             new OpenApiSecurityScheme
             {
                 Reference = new OpenApiReference
                 {
                     Type = ReferenceType.SecurityScheme,
                     Id = "ApiKey"
                 }
             },
             new string[] {}
         }
     });
});


Step 2: Create a new Middleware Class and call in the Program.cs


 public class ApiKeyMiddleware
 {
     private const string ApiKeyHeaderName = "X-api-key";
     private readonly RequestDelegate _next;
     private readonly string _apiKey;
     public ApiKeyMiddleware(RequestDelegate next, IConfiguration configuration)
     {
         _next = next;
         _apiKey = configuration["ApiKey"]; // Assuming you store the API key in your app settings
     }
     public async Task InvokeAsync(HttpContext context)
     {
         if (context.Request.Headers.TryGetValue(ApiKeyHeaderName, out var providedApiKey))
         {
             if (providedApiKey == _apiKey)
             {
                 await _next(context);
                 return;
             }
         }
         context.Response.StatusCode = StatusCodes.Status401Unauthorized;
         await context.Response.WriteAsync("Unauthorized");
     }
 }


Step 3: Copy these lines and paste the below lines into the Program.cs


app.UseMiddleware<ApiKeyMiddleware>();
app.UseAuthorization();
app.UseAuthentication();
app.MapControllers();
app.Run();


Step 4: Add  ApiKey in appsettings.json

"ApiKey": "setia",


Step 5: Run the application and you will Notice you can see the Authorize button in the top right position on Swagger.










Step 6: On the Click of a button, it will ask you to enter the key here. It will match the key mentioned in the app settings.json
























Step 7: It will match the key mentioned in the app settings.json. If the passed key is incorrect or you run the endpoint without a key it will throw an 401 Error.





















You will get the response if the key is correct.




Thursday, 1 August 2024

Use ChatGPT API in a C# application to Read the Image

To use the ChatGPT API in a C# application, you'll follow below steps:

1. Set Up Your OpenAI Account

  1. Sign UpIf you haven't already done so, create an account on the Open AI Website.

  1. Get API KeyAfter logging in, go to the API section and generate an API key.


Once you have the ChatGPT API Key, copy the method below into your application and run. You need to pass 2 parameters.

1) API Key
2) Image Path

 I am using Model "gpt-4o" in the below code.

public static async Task<string> ReadImagefromChatGPTAsync()
  {
      var client = new HttpClient();
      string apiKey = "Your Key Here";
      string imgPath = "D:\\aaa.png"; // Image Path here
      string prompt = "Extract A1C Value and Date from Image";
      try
      {
          // Convert image to base64
          byte[] imageBytes = File.ReadAllBytes(imgPath);
          string base64Image = Convert.ToBase64String(imageBytes);
          string imageBase64Url = $"data:image/png;base64,{base64Image}";

          var requestContent = new
          {
              model = "gpt-4o",
              messages = new[]
              {
              new {
                  role = "user",
                  content = new object[]
                  {
                      new { type = "text", text = prompt },
                      new { type = "image_url", image_url = new { url = imageBase64Url } }
                  }
              }
          },
              max_tokens = 500
          };


          string jsonString = Newtonsoft.Json.Linq.JObject.FromObject(requestContent).ToString();
          var content = new StringContent(jsonString, Encoding.UTF8, "application/json");
          client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");
        
          var response = await client.PostAsync("https://api.openai.com/v1/chat/completions", content);
          var responseString = await response.Content.ReadAsStringAsync();
          ChatGPTResponseModel chatGPTResponse = null;
          chatGPTResponse = JsonConvert.DeserializeObject<ChatGPTResponseModel>(responseString);

          if (chatGPTResponse != null)
          {
              var message = chatGPTResponse.Choices?[0].Text;
              return await Task.Run<string>(() => { return string.Empty; });
          }
          return await Task.Run<string>(() => { return string.Empty; });
      }
      catch (Exception ex)
      {
          Console.WriteLine($"An error occurred: {ex.Message}");
          return await Task.Run<string>(() => { return string.Empty; });
      }
  }


Below are the models for Deserialize the response


 public class ChatGPTResponseModel
 {
     [JsonPropertyName("id")]
     public string Id { get; set; }

     [JsonPropertyName("object")]
     [SuppressMessage("Naming", "CA1720:Identifier contains type name", Justification = "This is the name of the property returned by the API.")]
     public string @Object { get; set; }

     [JsonPropertyName("created")]
     public int Created { get; set; }

     [JsonPropertyName("model")]
     public string Model { get; set; }

     [JsonPropertyName("choices")]
     public List<ChatGPTChoice> Choices { get; set; }
 }


 [DebuggerDisplay("Text = {Text}")]
 public class ChatGPTChoice
 {
     [JsonPropertyName("text")]
     public string Text { get; set; }
    [JsonPropertyName("message")]
    public Message Message { get; set; }
 }

public class Message
{
    [JsonPropertyName("role")]
    public string Role { get; set; }

    [JsonPropertyName("conent")]
    public string Content { get; set; }
}

You can call your method like the one below in your main file.

 var output = await ReadImagefromChatGPTAsync();


This is all about this article. I hope you like it.

Use ChatGPT API in a C# application

 To use the ChatGPT API in a C# application, you'll follow below steps:

1. Set Up Your OpenAI Account

  1. Sign Up: If you haven't already done so, create an account on the Open AI Website.

  1. Get API Key: After logging in, go to the API section and generate an API key.


Once you have the ChatGPT API Key, copy the method below into your application and run. You need to pass 2 parameters.

1) API Key
2) Prompt


I am using Model "gpt-3.5-turbo-instruct", you can choose your model based on your requirements.



  private static async Task<string> GetResutlsFromChatGPT()
  {
      var apiKey = "Your Key here";
      var prompt = "Your prompt here";

      var chatGPTRequest = new
      {
          model = "gpt-3.5-turbo-instruct",
          temperature = 0.5f,
          max_tokens = 1000,
          top_p = 0.5f,
          frequency_penalty = 1.0f,
          presence_penalty = 0.0f,
          prompt = prompt
      };

      ChatGPTResponseModel chatGPTResponse = null;
      using (HttpClient httpClient = new HttpClient())
      {
          using (var httpReq = new HttpRequestMessage(HttpMethod.Post, "https://api.openai.com/v1/completions"))
          {
              httpReq.Headers.Add("Authorization", $"Bearer {apiKey}");
              string requestString = JsonConvert.SerializeObject(chatGPTRequest);
              httpReq.Content = new StringContent(requestString, Encoding.UTF8, "application/json");

              using (HttpResponseMessage httpResponse = await httpClient.SendAsync(httpReq))
              {
                  if (httpResponse.IsSuccessStatusCode)
                  {
                      string responseString = await httpResponse.Content.ReadAsStringAsync();
                      chatGPTResponse = JsonConvert.DeserializeObject<ChatGPTResponseModel>(responseString);
                      if (chatGPTResponse != null)
                      {
                          string completionText = chatGPTResponse.Choices?[0]?.Text;
                          return await Task.Run<string>(() => { return completionText ?? string.Empty; });
                      }
                  }
              }
          }
      }

      return await Task.Run(() => { return string.Empty; });
  }


Below are the models for Deserialize the response


 public class ChatGPTResponseModel
 {
     [JsonPropertyName("id")]
     public string Id { get; set; }

     [JsonPropertyName("object")]
     [SuppressMessage("Naming", "CA1720:Identifier contains type name", Justification = "This is the name of the property returned by the API.")]
     public string @Object { get; set; }

     [JsonPropertyName("created")]
     public int Created { get; set; }

     [JsonPropertyName("model")]
     public string Model { get; set; }

     [JsonPropertyName("choices")]
     public List<ChatGPTChoice> Choices { get; set; }
 }


 [DebuggerDisplay("Text = {Text}")]
 public class ChatGPTChoice
 {
     [JsonPropertyName("text")]
     public string Text { get; set; }

 }


You can call your method like below in your main file.

 var output = await GetResutlsFromChatGPT();

This is all about this article. I hope you like it.



Thursday, 25 July 2024

AWS Elastic Beanstalk by Amazon Web Services

AWS Elastic Beanstalk is a Platform as a Service (PaaS) offered by Amazon Web Services. 

It simplifies deploying, managing, and scaling web applications and services. Here's a detailed overview: 


AWS Elastic Beanstalk supports web applications written in many popular languages and frameworks. It requires no or minimal code changes to go from the development machine to the cloud. Development options for deploying your web applications include Java, .NET, Node.js, PHP, Ruby, Python, Go, and Docker.

Let's deploy the .Net Application to EC2 via Elastic Beanstalk.

Step 1: Open the Visual Studio --> Go to Extensions --> Click on Manage Extensions
Step 2: Search for AWS Toolkit with Amazon Q Extension.
Step 3: Install the extension and restart the PC

Step 4: When you right-click on the Solution, you can see published with AWS options.















Step 5: Click on the Publish to AWS option. It will validate your AWS connection. If it is not connected, you need to enter AWS User credentials.

Step 6: You can choose the OS based on your app.














You can go to View Menu in Visual Studio and Click AWS Explorer to ensure you are connected with AWS. If you are not connected with AWS then get the access key from AWS Portal, Under users sections













Step 7: Click on the Publish button












It will create a new EC2 and deploy the website automatically in IIS. 


Pricing:

There is no additional charge for Elastic Beanstalk. You pay only for the underlying AWS resources that your application consumes.

Thursday, 27 June 2024

Get Microsoft Entra ID (formerly Azure Active Directory) Client Token From Postman

Let's learn step by step How to get the AD Client Token.

Step 1: Go to Azure Portal

Step 2: Search Microsoft Entra ID and click it.

Step 3: Go to App Registrations











Step 4: Click on the application and copy TenantId, Client Id and Client Secret







Step  5: Below are the parameters we required for the postman request

Parameter        Description
Tenant Id               The (tenant) ID for the related application is registered in Microsoft Entra ID.
client_id                 The (client) ID for the related application registered in Microsoft Entra ID.
client_secret           Client secret value for the related application registered in Microsoft Entra ID.
grant_type              client_credentials
scope                      https://graph.microsoft.com/.default 


Step 6: Add a new Post request in the Postman with the below URL and above parameters, you will get token as shown in the snapshot below.

https://login.microsoftonline.com/{{tenantId}}/oauth2/v2.0/token


























Here you can see the token.

C# Create Dynamic JSON With Dynamic Keys

 In this article, we will create a dynamic JSON.

When you have a requirement where you are not sure how many nodes/keys you need to create in the JSON then follow the below approach.


Step 1: Declare a dictionary

            var fileData = new Dictionary<string, object>();


Step 2: Add dynamic data, in my example, I have an array of nodes and values. So, I am adding values to each.

 foreach (DocumentKeyValuePair kvp in result.KeyValuePairs)

 {

             fileData[kvp.Key.Content] = kvp.Value.Content;     

 }


Step 3: Searlize Object using Newtonsoft.Json;


 string json = JsonConvert.SerializeObject(fileData, Formatting.Indented);

 System.IO.File.WriteAllText(@"D:\file.json", json);



I am also saving the JSON in D drive, you can specify your path.

Your file will be saved in the specific directory and you can see I have dynamic keys and values.




Azure - The attempt to publish website and failed with HTTP status code 'Unauthorized'

OR

The attempt to publish the ZIP file through failed with HTTP status code Unauthorized.


When you get this error while publishing the Website, App Services, or Azure Function in Azure Portal. You need to update the settings in Azure Portal.



By default, the publish website is restricted for App Services and Azure Function from Visual Studio, we need to enable the settings.


SCM Basic Auth Publishing Credentials


Go to Azure Portal --> Go to App Services/Azure Functions --> Click Configuration --> Enable SCM Basic Auth Publishing Credentials.























Once you enable the settings, you can publish the website from Visual Studio.






Wednesday, 10 April 2024

How to find the reason of HTTP Error 500.30 - ASP.NET Core app failed to start in Azure App Service

HTTP Error 500.30 - The ASP.NET Core app failed to start

If your web app is throwing an error HTTP error 500.30 then how to find the root cause in Azure

There are multiple ways to find the error. Let's discuss the first approach.

Approach 1

Step 1: Go to Azure Portal 
Step 2: Click on App Service
Step 3: Click on Diagnose and Solve Problems.














Step 4:  Click on Web App Down
















Step 5:  Here you can click on the View Details link under .Net Core startup failure and you can find the reason for the app down.


















Approach 2

Step 1: Go to App Service
Step 2: Click on Environment Variables
Step 3: Click on App Settings

Step 4: Add new Key "ASPNETCORE_DETAILEDERRORS", Set value =1


















Restart the app it will show the error on the page instead of 500.30 - ASP.NET Core app failed to start

That's all about this article, I hope you like it.

Monday, 19 February 2024

Hosting a Static Website Using Amazon S3


In today's world, most websites are static, which means they run no server-side code and only consist of HTML, CSS, and JavaScript. There is no server-side code to run, so there is no reason to host them on a traditional server.


Hosting static websites on an S3 bucket costs one to two dollars monthly and scales to millions of users.


Let's learn how to create a S3 Bucket and host the website.


Step 1: Create a Bucket

You can open S3 from the Amazon console by searching for S3 or clicking the link below. Console at https://console.aws.amazon.com/s3/


1. Click on Create Bucket











2. Enter your Bucket name and select AWS Region.













3. Uncheck block all public access



















4. Keep the remaining settings as it is like bucket versioning etc.

5. Click on the Create Bucket button.

6. You will receive the below message.









Step 2: Upload files

1. Click your Bucket Name


















2. Click on the upload button on the right.











3. Click on the add files button and upload your files. 














4. I am uploading index.html for now. You can upload your files (CSS/Images/Javascript and HTML)























Upload your file and then click on the Close Button.

Step 3: Allow Public Access

1. Go to permissions and Edit













2. Uncheck Block all public access and click Save changes.


Step 4: Enable Static website hosting


1. Click on your bucket go to Properties and scroll down.




















2. Go to Static Website Hosting and Click Edit







3. Enable Static Website and Specify the index document. I am adding an index.html as a startup page.





















4. Click Save Changes.


Step 5: Get URL

1. Click on your bucket Name and Go To Properties.

2. Under static website, you can get the static website URL.













3. If you run this URL you will get an error, access be denied, 403













Step 6: Set Bucket Policy

1. Clock on Bucket Name and Go to the Permissions Tab.

2. Go to Bucket Policy and Edit













3. Copy the below lines and Save. Note: You need to enter your Bucket ARN in Resource. You can find Bucket ARN in the Properties Tab.


{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "aarn:aws:s3:::tssbucket2024/*"
        }
    ]
}






























4. Update ARN and press the Save Changes Button.

5. Open the link in the browser and you can see the Website is running.


http://tssbucket2024.s3-website.eu-north-1.amazonaws.com/














This is all about this article. I hope you like it.


Implement Authorization in Swagger with Static Value in Header .Net 8

If you want an anonymous user should not run the APIs. To run your API Endpoints From Swagger / Postman / Code the user should pass the head...