ASP.NET Core 5.0 - SingleUser NuGet Package
Update 07/29/2021
I updated KenHaggerty.Com.SingleUser NuGet package to support Bootstrap v5. I updated the SingleUser Class Lib Project and the article with Bootstrap v5 markup. The Login page Implements a Bootstrap checkbox with both V4 and V5 checkbox classes.
This article will describe the KenHaggerty.Com.SingleUser NuGet package. The package provides cookie authentication for a single user to an ASP.NET Core Web Application. I will assume you have created a new ASP.NET Core 5.0 Razor Pages project. See Tutorial: Get started with Razor Pages in ASP.NET Core.
The KenHaggerty.Com.SingleUser NuGet package is the result of a web app I developed. It was a simple web app which had Log In, Log Out, and Admin pages. I used a hard-coded user and cookie authentication to restrict access to Admin pages. Copying the pages into new projects was easier than copying the project and renaming the namespaces. I realized implementing authentication for a single user was the perfect candidate for my first published NuGet package at KenHaggerty.Com.SingleUser. This article will focus on implementing the KenHaggerty.Com.SingleUser published package.
Quick Start
- Install KenHaggerty.Com.SingleUser.
- Edit the host web app's Startup.cs.
- Authorize the Admin folder.
- Add the _SingleUserLoginPartial to the host's Shared/_Layout.cshtml's navbar.
- Build, run, and test.
Install KenHaggerty.Com.SingleUser.
- Manage NuGet Packages on the host.
- Search for kenhaggerty on the Browse tab.
Edit the host Startup.ConfigureServices
- Authorize the Admin folder.
- Add services.AddSingleUser();
public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages(options => { options.Conventions.AuthorizeFolder("/Admin"); });
    services.AddSingleUser();
}
        Edit the host Startup.Configure
- Add app.UseSingleUser();
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseRouting();
    app.UseSingleUser();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}
        Edit the host Shared/_Layout.cshtml
- Insert _SingleUserLoginPartial into the host's navbar.
navbar-collapse with flex-sm-row-reverse
<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
    <partial name="_SingleUserLoginPartial" />
    <ul class="navbar-nav flex-grow-1">
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="" asp-page="/Admin/Index">Admin</a>
        </li>
    </ul>
</div>
        navbar-collapse with justify-content-between
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
    <ul class="navbar-nav flex-grow-1">
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="" asp-page="/Admin/Index">Admin</a>
        </li>
    </ul>
    <partial name="_SingleUserLoginPartial" />
</div>
        Package Log In and Log Out Pages
- Located in an Account folder/path.
- Reference the host's Shared/_Layout.cshtml.
- Log In page verifies configuration.
Default Admin/Index Page
- Located in an Admin folder/path.
- References the host's Shared/_Layout.cshtml.
- Configuration hints and verification.
- Overridden by the host's Admin/Index page.
Password (Not Required)
For basic password support, add a SingleUserPassword key with your password to the host's appsettings.json's root.
AddSingleUser Implements:
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.LoginPath = "/account/login";
        options.LogoutPath = "/account/logout";
        options.Cookie.SameSite = SameSiteMode.Strict;
        options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
        options.Cookie.IsEssential = true;
    });
        UseSingleUser Implements:
app.UseAuthentication();
_SingleUserLoginPartial.cshtml Implements:
<ul class="navbar-nav">
    @if (User.Identity.IsAuthenticated)
    {
        <li class="nav-item">
            <form class="d-inline" asp-page="/Account/LogOut" method="post">
                <button type="submit" class="nav-link text-dark btn btn-link pt-1">
                    Log Out @User.Identity.Name
                </button>
            </form>
        </li>
    }
    else
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-page="/Account/LogIn">Log In</a>
        </li>
    }
</ul>
            The Login page Implements a Bootstrap checkbox with both V4 and V5 checkbox classes.
Login.cshtml:
<div class="custom-control custom-checkbox form-check">
    <input type="checkbox" class="custom-control-input form-check-input" asp-for="IsPersistent" />
    <label class="custom-control-label form-check-label" asp-for="IsPersistent">
        @Html.DisplayNameFor(model => model.IsPersistent)
    </label>
</div>
        Registered users on KenHaggerty.Com can download the source code for free at Manage > Assets. I created a topic, ASP.NET Core 5.0 - SingleUser Class Lib Project for discussions. More details and screenshots at ASP.NET Core 5.0 - SingleUser Class Lib Project.
Comments(0)