{"id":12697,"date":"2025-01-21T14:45:59","date_gmt":"2025-01-21T14:45:59","guid":{"rendered":"https:\/\/myprojects.advchaweb.com\/?p=12697"},"modified":"2025-01-21T15:57:44","modified_gmt":"2025-01-21T15:57:44","slug":"create-a-login-app-with-asp-net-on-ubuntu-22-04","status":"publish","type":"post","link":"https:\/\/myprojects.advchaweb.com\/index.php\/2025\/01\/21\/create-a-login-app-with-asp-net-on-ubuntu-22-04\/","title":{"rendered":"Create a Login App with ASP.NET on Ubuntu 22.04"},"content":{"rendered":"<p>Here&#8217;s a step-by-step guide to create a simple login form using ASP.NET Core (C#) and MS SQL Server with VS Code and Linux:<\/p>\n<ol>\n<li>Install .NET SDK If you haven&#8217;t already, install the .NET SDK for your Linux distribution. You can find instructions on the official Microsoft website.check your dotnet version<br \/>\n[codesyntax lang=&#8221;bash&#8221;]<\/p>\n<pre>dotnet --version\r\n8.0.405<\/pre>\n<p>[\/codesyntax]<\/li>\n<li>Create a new ASP.NET Core project Open a terminal and run:\n<pre class=\"content\"><code class=\"language-plainText\">dotnet new mvc -n LoginApp<\/code><\/pre>\n<p>[codesyntax lang=&#8221;bash&#8221;]<\/p>\n<pre>satria@teddy:~\/Documents\/projects\/aspnet$ dotnet new mvc -n LoginApp\r\nThe template \"ASP.NET Core Web App (Model-View-Controller)\" was created successfully.\r\nThis template contains technologies from parties other than Microsoft, see https:\/\/aka.ms\/aspnetcore\/8.0-third-party-notices for details.\r\n\r\nProcessing post-creation actions...\r\nRestoring \/home\/satria\/Documents\/projects\/aspnet\/LoginApp\/LoginApp.csproj:\r\n  Determining projects to restore...\r\n  Restored \/home\/satria\/Documents\/projects\/aspnet\/LoginApp\/LoginApp.csproj (in 83 ms).\r\nRestore succeeded.<\/pre>\n<p>[\/codesyntax]<\/p>\n<p>Go to the project directory &#8216;LoginApp&#8217; with &#8216;cd LoginApp&#8217;<\/li>\n<li>Install required NuGet packages Run the following commands:<br \/>\n[codesyntax lang=&#8221;bash&#8221;]<\/p>\n<pre>dotnet add package Microsoft.EntityFrameworkCore.SqlServer\r\ndotnet add package Microsoft.EntityFrameworkCore.Design\r\ndotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore\r\n<\/pre>\n<p>[\/codesyntax]<\/p>\n<p>Make sure the version is match in LoginApp.csproj<br \/>\n[codesyntax lang=&#8221;csharp&#8221;]<\/p>\n<pre>&lt;ItemGroup&gt;\r\n    &lt;PackageReference Include=\"Microsoft.AspNetCore.Identity.EntityFrameworkCore\" Version=\"8.0.0\" \/&gt;\r\n    &lt;PackageReference Include=\"Microsoft.EntityFrameworkCore.SqlServer\" Version=\"8.0.0\" \/&gt;\r\n    &lt;PackageReference Include=\"Microsoft.EntityFrameworkCore.Design\" Version=\"8.0.0\"&gt;\r\n      &lt;IncludeAssets&gt;runtime; build; native; contentfiles; analyzers; buildtransitive&lt;\/IncludeAssets&gt;\r\n      &lt;PrivateAssets&gt;all&lt;\/PrivateAssets&gt;\r\n    &lt;\/PackageReference&gt;\r\n  &lt;\/ItemGroup&gt;<\/pre>\n<p>[\/codesyntax]<\/li>\n<li>Set up the database connection Open\u00a0<code>appsettings.json<\/code>\u00a0and add the connection string:<br \/>\n[codesyntax lang=&#8221;text&#8221;]<\/p>\n<pre>\"ConnectionStrings\": {\r\n    \"DefaultConnection\": \"Server=localhost;Database=LoginApp;User Id=your_username;Password=your_password;TrustServerCertificate=True;\"\r\n  },<\/pre>\n<p>[\/codesyntax]<br \/>\nNote: I need to add &#8216;TrustServerCertificate=True;&#8217;<\/li>\n<li>Create ApplicationDbContext Create a new file\u00a0<code>ApplicationDbContext.cs<\/code><br \/>\n[codesyntax lang=&#8221;csharp&#8221;]<\/p>\n<pre>using Microsoft.AspNetCore.Identity.EntityFrameworkCore;\r\nusing Microsoft.EntityFrameworkCore;\r\n\r\nnamespace LoginApp\r\n{\r\n    public class ApplicationDbContext : IdentityDbContext\r\n    {\r\n        public ApplicationDbContext(DbContextOptions&lt;ApplicationDbContext&gt; options)\r\n            : base(options)\r\n        {\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>[\/codesyntax]<\/li>\n<li>Update Program.cs Replace the content of\u00a0<code>Program.cs<\/code>:<br \/>\n[codesyntax lang=&#8221;csharp&#8221;]<\/p>\n<pre>using LoginApp;\r\nusing Microsoft.AspNetCore.Identity;\r\nusing Microsoft.EntityFrameworkCore;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\n\/\/ Add services to the container.\r\nbuilder.Services.AddControllersWithViews();\r\n\r\nbuilder.Services.AddDbContext&lt;ApplicationDbContext&gt;(options =&gt;\r\n    options.UseSqlServer(builder.Configuration.GetConnectionString(\"DefaultConnection\")));\r\n\r\nbuilder.Services.AddIdentity&lt;IdentityUser, IdentityRole&gt;()\r\n    .AddEntityFrameworkStores&lt;ApplicationDbContext&gt;();\r\n\r\nvar app = builder.Build();\r\n\r\n\/\/ Configure the HTTP request pipeline.\r\nif (!app.Environment.IsDevelopment())\r\n{\r\n    app.UseExceptionHandler(\"\/Home\/Error\");\r\n    app.UseHsts();\r\n}\r\n\r\napp.UseHttpsRedirection();\r\napp.UseStaticFiles();\r\n\r\napp.UseRouting();\r\n\r\napp.UseAuthentication();\r\napp.UseAuthorization();\r\n\r\napp.MapControllerRoute(\r\n    name: \"default\",\r\n    pattern: \"{controller=Home}\/{action=Index}\/{id?}\");\r\n\r\n\/\/ Initialize the database\r\nusing (var scope = app.Services.CreateScope())\r\n{\r\n    var services = scope.ServiceProvider;\r\n    try\r\n    {\r\n        var context = services.GetRequiredService&lt;ApplicationDbContext&gt;();\r\n        context.Database.EnsureCreated();\r\n        await DbInitializer.Initialize(services);\r\n    }\r\n    catch (Exception ex)\r\n    {\r\n        var logger = services.GetRequiredService&lt;ILogger&lt;Program&gt;&gt;();\r\n        logger.LogError(ex, \"An error occurred while seeding the database.\");\r\n    }\r\n}\r\n\r\napp.Run();\r\n<\/pre>\n<p>[\/codesyntax]<\/li>\n<li>Create Login Model Create\u00a0<code>Models\/LoginModel.cs<\/code>:<br \/>\n[codesyntax lang=&#8221;csharp&#8221;]<\/p>\n<pre>using System.ComponentModel.DataAnnotations;\r\n\r\nnamespace LoginApp.Models\r\n{\r\n    public class LoginModel\r\n    {\r\n        [Required]\r\n        [EmailAddress]\r\n        public string Email { get; set; } = string.Empty;\r\n\r\n        [Required]\r\n        [DataType(DataType.Password)]\r\n        public string Password { get; set; } = string.Empty;\r\n\r\n        [Display(Name = \"Remember me?\")]\r\n        public bool RememberMe { get; set; }\r\n    }\r\n}\r\n<\/pre>\n<p>[\/codesyntax]<\/li>\n<li>Create Account Controller Create\u00a0<code>Controllers\/AccountController.cs<\/code>:<br \/>\n[codesyntax lang=&#8221;csharp&#8221;]<\/p>\n<pre>using LoginApp.Models;\r\nusing Microsoft.AspNetCore.Identity;\r\nusing Microsoft.AspNetCore.Mvc;\r\n\r\nnamespace LoginApp.Controllers\r\n{\r\n    public class AccountController : Controller\r\n    {\r\n        private readonly SignInManager&lt;IdentityUser&gt; _signInManager;\r\n\r\n        public AccountController(SignInManager&lt;IdentityUser&gt; signInManager)\r\n        {\r\n            _signInManager = signInManager;\r\n        }\r\n\r\n        [HttpGet]\r\n        public IActionResult Login()\r\n        {\r\n            return View();\r\n        }\r\n\r\n        [HttpPost]\r\n        public async Task&lt;IActionResult&gt; Login(LoginModel model)\r\n        {\r\n            if (ModelState.IsValid)\r\n            {\r\n                var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);\r\n                if (result.Succeeded)\r\n                {\r\n                    return RedirectToAction(\"Index\", \"Home\");\r\n                }\r\n                ModelState.AddModelError(string.Empty, \"Invalid login attempt.\");\r\n            }\r\n            return View(model);\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>[\/codesyntax]<\/li>\n<li>Create Login View Create\u00a0<code>Views\/Account\/Login.cshtml<\/code>:<br \/>\n[codesyntax lang=&#8221;html4strict&#8221;]<\/p>\n<pre>@model LoginApp.Models.LoginModel\r\n\r\n&lt;h2&gt;Login&lt;\/h2&gt;\r\n\r\n&lt;form asp-action=\"Login\" method=\"post\"&gt;\r\n    &lt;div asp-validation-summary=\"ModelOnly\" class=\"text-danger\"&gt;&lt;\/div&gt;\r\n    &lt;div class=\"form-group\"&gt;\r\n        &lt;label asp-for=\"Email\"&gt;&lt;\/label&gt;\r\n        &lt;input asp-for=\"Email\" class=\"form-control\" \/&gt;\r\n        &lt;span asp-validation-for=\"Email\" class=\"text-danger\"&gt;&lt;\/span&gt;\r\n    &lt;\/div&gt;\r\n    &lt;div class=\"form-group\"&gt;\r\n        &lt;label asp-for=\"Password\"&gt;&lt;\/label&gt;\r\n        &lt;input asp-for=\"Password\" class=\"form-control\" \/&gt;\r\n        &lt;span asp-validation-for=\"Password\" class=\"text-danger\"&gt;&lt;\/span&gt;\r\n    &lt;\/div&gt;\r\n    &lt;div class=\"form-group\"&gt;\r\n        &lt;div class=\"checkbox\"&gt;\r\n            &lt;label&gt;\r\n                &lt;input asp-for=\"RememberMe\" \/&gt; @Html.DisplayNameFor(m =&gt; m.RememberMe)\r\n            &lt;\/label&gt;\r\n        &lt;\/div&gt;\r\n    &lt;\/div&gt;\r\n    &lt;button type=\"submit\" class=\"btn btn-primary\"&gt;Log in&lt;\/button&gt;\r\n&lt;\/form&gt;\r\n<\/pre>\n<p>[\/codesyntax]<\/li>\n<li>Set up the database. Create a new database &#8216;LoginApp&#8217;<\/li>\n<li>Add a test user Create\u00a0<code>DbInitializer.cs<\/code>:<br \/>\n[codesyntax lang=&#8221;csharp&#8221;]<\/p>\n<pre>using Microsoft.AspNetCore.Identity;\r\n\r\nnamespace LoginApp\r\n{\r\n    public static class DbInitializer\r\n    {\r\n        public static async Task Initialize(IServiceProvider serviceProvider)\r\n        {\r\n            var userManager = serviceProvider.GetRequiredService&lt;UserManager&lt;IdentityUser&gt;&gt;();\r\n\r\n            string email = \"admin@example.com\";\r\n            string password = \"Admin123!\";\r\n\r\n            if (await userManager.FindByEmailAsync(email) == null)\r\n            {\r\n                var user = new IdentityUser { UserName = email, Email = email };\r\n                await userManager.CreateAsync(user, password);\r\n            }\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>[\/codesyntax]<br \/>\nNote: it&#8217;ll create a new dummy user with<br \/>\nemail: admin@example.com<br \/>\npassword: Admin123!<\/li>\n<li>Run the application Execute:\n<pre class=\"content\"><code class=\"language-plainText\">dotnet run<\/code><\/pre>\n<\/li>\n<li>Navigate to\u00a0<code>http:\/\/localhost:5000\/Account\/Login<\/code>\u00a0in your browser.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12703\" src=\"http:\/\/myprojects.advchaweb.com\/wp-content\/uploads\/2025\/01\/screenshot-localhost_5190-2025_01_21-22_33_28.png\" alt=\"\" width=\"826\" height=\"473\" srcset=\"https:\/\/myprojects.advchaweb.com\/wp-content\/uploads\/2025\/01\/screenshot-localhost_5190-2025_01_21-22_33_28.png 826w, https:\/\/myprojects.advchaweb.com\/wp-content\/uploads\/2025\/01\/screenshot-localhost_5190-2025_01_21-22_33_28-300x172.png 300w, https:\/\/myprojects.advchaweb.com\/wp-content\/uploads\/2025\/01\/screenshot-localhost_5190-2025_01_21-22_33_28-768x440.png 768w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/li>\n<li>create some navigation menus (login, logout, etc) on the homepage<br \/>\nCreate a new file called\u00a0<code>_NavBar.cshtml<\/code>\u00a0in the\u00a0<code>Views\/Shared<\/code>\u00a0folder with the following content:<br \/>\n[codesyntax lang=&#8221;html4strict&#8221;]<\/p>\n<pre>@using Microsoft.AspNetCore.Identity\r\n@inject SignInManager&lt;IdentityUser&gt; SignInManager\r\n@inject UserManager&lt;IdentityUser&gt; UserManager\r\n\r\n&lt;nav class=\"navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3\"&gt;\r\n    &lt;div class=\"container\"&gt;\r\n        &lt;a class=\"navbar-brand\" asp-area=\"\" asp-controller=\"Home\" asp-action=\"Index\"&gt;LoginApp&lt;\/a&gt;\r\n        &lt;button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\".navbar-collapse\" aria-controls=\"navbarSupportedContent\"\r\n                aria-expanded=\"false\" aria-label=\"Toggle navigation\"&gt;\r\n            &lt;span class=\"navbar-toggler-icon\"&gt;&lt;\/span&gt;\r\n        &lt;\/button&gt;\r\n        &lt;div class=\"navbar-collapse collapse d-sm-inline-flex justify-content-between\"&gt;\r\n            &lt;ul class=\"navbar-nav flex-grow-1\"&gt;\r\n                &lt;li class=\"nav-item\"&gt;\r\n                    &lt;a class=\"nav-link text-dark\" asp-area=\"\" asp-controller=\"Home\" asp-action=\"Index\"&gt;Home&lt;\/a&gt;\r\n                &lt;\/li&gt;\r\n                @if (SignInManager.IsSignedIn(User))\r\n                {\r\n                    &lt;li class=\"nav-item\"&gt;\r\n                        &lt;a class=\"nav-link text-dark\" asp-area=\"\" asp-controller=\"Account\" asp-action=\"Logout\"&gt;Logout&lt;\/a&gt;\r\n                    &lt;\/li&gt;\r\n                }\r\n                else\r\n                {\r\n                    &lt;li class=\"nav-item\"&gt;\r\n                        &lt;a class=\"nav-link text-dark\" asp-area=\"\" asp-controller=\"Account\" asp-action=\"Login\"&gt;Login&lt;\/a&gt;\r\n                    &lt;\/li&gt;\r\n                    &lt;li class=\"nav-item\"&gt;\r\n                        &lt;a class=\"nav-link text-dark\" asp-area=\"\" asp-controller=\"Account\" asp-action=\"Register\"&gt;Register&lt;\/a&gt;\r\n                    &lt;\/li&gt;\r\n                }\r\n            &lt;\/ul&gt;\r\n        &lt;\/div&gt;\r\n    &lt;\/div&gt;\r\n&lt;\/nav&gt;\r\n<\/pre>\n<p>[\/codesyntax]<\/p>\n<p>Now, let&#8217;s include this partial view in your layout file. Open the\u00a0<code>Views\/Shared\/_Layout.cshtml<\/code>\u00a0file and add the following line just after the opening\u00a0<code>&lt;body&gt;<\/code>\u00a0tag:<br \/>\n[codesyntax lang=&#8221;html4strict&#8221;]<\/p>\n<pre>&lt;body&gt;\r\n    &lt;partial name=\"_NavBar\" \/&gt;\r\n    &lt;!--header&gt;\r\n        &lt;nav class=\"navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3\"&gt;\r\n            &lt;div class=\"container-fluid\"&gt;\r\n                &lt;a class=\"navbar-brand\" asp-area=\"\" asp-controller=\"Home\" asp-action=\"Index\"&gt;LoginApp&lt;\/a&gt;\r\n                &lt;button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\".navbar-collapse\" aria-controls=\"navbarSupportedContent\"\r\n                        aria-expanded=\"false\" aria-label=\"Toggle navigation\"&gt;\r\n                    &lt;span class=\"navbar-toggler-icon\"&gt;&lt;\/span&gt;\r\n                &lt;\/button&gt;\r\n                &lt;div class=\"navbar-collapse collapse d-sm-inline-flex justify-content-between\"&gt;\r\n                    &lt;ul class=\"navbar-nav flex-grow-1\"&gt;\r\n                        &lt;li class=\"nav-item\"&gt;\r\n                            &lt;a class=\"nav-link text-dark\" asp-area=\"\" asp-controller=\"Home\" asp-action=\"Index\"&gt;Home&lt;\/a&gt;\r\n                        &lt;\/li&gt;\r\n                        &lt;li class=\"nav-item\"&gt;\r\n                            &lt;a class=\"nav-link text-dark\" asp-area=\"\" asp-controller=\"Home\" asp-action=\"Privacy\"&gt;Privacy&lt;\/a&gt;\r\n                        &lt;\/li&gt;\r\n                    &lt;\/ul&gt;\r\n                &lt;\/div&gt;\r\n            &lt;\/div&gt;\r\n        &lt;\/nav&gt;\r\n    &lt;\/header--&gt;\r\n    &lt;!-- ... existing content ... --&gt;\r\n&lt;\/body&gt;\r\n<\/pre>\n<p>[\/codesyntax]<br \/>\nNote: I need to remove the default &lt;header&gt; tag to use the new partial navbar<\/li>\n<li>create controller for account logout<br \/>\nmodify Controllers\/AccountController.cs<br \/>\n[codesyntax lang=&#8221;csharp&#8221;]<\/p>\n<pre>using LoginApp.Models;\r\nusing Microsoft.AspNetCore.Identity;\r\nusing Microsoft.AspNetCore.Mvc;\r\n\r\nnamespace LoginApp.Controllers\r\n{\r\n    public class AccountController : Controller\r\n    {\r\n        ...\r\n\r\n        [HttpPost]\r\n        public async Task&lt;IActionResult&gt; Login(LoginModel model)\r\n        {\r\n           ...\r\n        }\r\n\r\n        [HttpPost]\r\n        [ValidateAntiForgeryToken]\r\n        public async Task&lt;IActionResult&gt; Logout()\r\n        {\r\n            await _signInManager.SignOutAsync();\r\n            return RedirectToAction(\"Index\", \"Home\");\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>[\/codesyntax]<\/p>\n<p>Now, let&#8217;s update the\u00a0<code>_NavBar.cshtml<\/code>\u00a0partial view to use a form for the logout action, as it should be a POST request. Update the logout link in the\u00a0<code>_NavBar.cshtml<\/code>\u00a0file like this:<br \/>\n[codesyntax lang=&#8221;html4strict&#8221;]<\/p>\n<pre>\/\/ ... existing code ...\r\n@if (SignInManager.IsSignedIn(User))\r\n{\r\n    &lt;li class=\"nav-item\"&gt;\r\n        &lt;form asp-area=\"\" asp-controller=\"Account\" asp-action=\"Logout\" method=\"post\" id=\"logoutForm\" class=\"navbar-right\"&gt;\r\n            &lt;button type=\"submit\" class=\"btn btn-link navbar-btn navbar-link\"&gt;Logout&lt;\/button&gt;\r\n        &lt;\/form&gt;\r\n    &lt;\/li&gt;\r\n}\r\n\/\/ ... existing code ...\r\n<\/pre>\n<p>[\/codesyntax]<br \/>\nat the end of this file, add this javascript<br \/>\n[codesyntax lang=&#8221;html4strict&#8221;]<\/p>\n<pre>&lt;script&gt;\r\n    $(function() {\r\n        $('#logoutForm').on('click', function(e) {\r\n            e.preventDefault();\r\n            $(this).submit();\r\n        });\r\n    });\r\n&lt;\/script&gt;<\/pre>\n<p>[\/codesyntax]<\/li>\n<li>Add controller for registration and forgot password?<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Here&#8217;s a step-by-step guide to create a simple login form using ASP.NET Core (C#) and MS SQL Server with VS Code and Linux: Install .NET SDK If you haven&#8217;t already, install the .NET SDK for your Linux distribution. You can find instructions on the official Microsoft website.check your dotnet version [codesyntax lang=&#8221;bash&#8221;] dotnet &#8211;version 8.0.405 &hellip; <a href=\"https:\/\/myprojects.advchaweb.com\/index.php\/2025\/01\/21\/create-a-login-app-with-asp-net-on-ubuntu-22-04\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Create a Login App with ASP.NET on Ubuntu 22.04&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[92,80,17,132],"tags":[],"class_list":["post-12697","post","type-post","status-publish","format-standard","hentry","category-asp-net","category-c-3","category-ubuntu","category-ubuntu-22-04"],"_links":{"self":[{"href":"https:\/\/myprojects.advchaweb.com\/index.php\/wp-json\/wp\/v2\/posts\/12697","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/myprojects.advchaweb.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/myprojects.advchaweb.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/myprojects.advchaweb.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/myprojects.advchaweb.com\/index.php\/wp-json\/wp\/v2\/comments?post=12697"}],"version-history":[{"count":8,"href":"https:\/\/myprojects.advchaweb.com\/index.php\/wp-json\/wp\/v2\/posts\/12697\/revisions"}],"predecessor-version":[{"id":12706,"href":"https:\/\/myprojects.advchaweb.com\/index.php\/wp-json\/wp\/v2\/posts\/12697\/revisions\/12706"}],"wp:attachment":[{"href":"https:\/\/myprojects.advchaweb.com\/index.php\/wp-json\/wp\/v2\/media?parent=12697"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/myprojects.advchaweb.com\/index.php\/wp-json\/wp\/v2\/categories?post=12697"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/myprojects.advchaweb.com\/index.php\/wp-json\/wp\/v2\/tags?post=12697"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}