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

  1. Install KenHaggerty.Com.SingleUser.
  2. Edit the host web app's Startup.cs.
  3. Authorize the Admin folder.
  4. Add the _SingleUserLoginPartial to the host's Shared/_Layout.cshtml's navbar.
  5. Build, run, and test.
Install KenHaggerty.Com.SingleUser.
  • Manage NuGet Packages on the host.
  • Search for kenhaggerty on the Browse tab.
KenHaggerty.Com.SingleUser NuGet Package.
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.

Ken Haggerty
Created 10/17/20
Updated 07/30/21 03:54 GMT

Log In or Reset Quota to read more.

Article Tags:

Authorization
Successfully completed. Thank you for contributing.
Contribute to enjoy content without advertisments.
Something went wrong. Please try again.

Comments(0)

Loading...
Loading...

Not accepting new comments.

Submit your comment. Comments are moderated.

User Image.
DisplayedName - Member Since ?