Skip to content

Instantly share code, notes, and snippets.

@AaronSadlerUK
Last active August 31, 2022 03:05
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AaronSadlerUK/7b1163a508b11bed9ae92fd87f4ca9a2 to your computer and use it in GitHub Desktop.
Save AaronSadlerUK/7b1163a508b11bed9ae92fd87f4ca9a2 to your computer and use it in GitHub Desktop.
How to create member login and logout form in Umbraco V9 (RC)
@model Umbraco.Cms.Web.Common.Models.LoginModel
@using (Html.BeginUmbracoForm<MemberAuthenticationSurfaceController>("Login", FormMethod.Post))
{
@Html.LabelFor(m => m.Username)
@Html.TextBoxFor(m => m.Username, new { placeholder = "Username" })
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password, new { placeholder = "Password" })
@Html.ValidationSummary()
<button name="login" type="submit">Login</button>
}
<a href="@Url.SurfaceAction("Logout", "MemberAuthenticationSurface")">Logout</a>
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Core.Cache;
using Umbraco.Cms.Core.Logging;
using Umbraco.Cms.Core.Routing;
using Umbraco.Cms.Core.Security;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Web;
using Umbraco.Cms.Infrastructure.Persistence;
using Umbraco.Cms.Web.Common.Models;
using Umbraco.Cms.Web.Common.Security;
using Umbraco.Cms.Web.Website.Controllers;
public class MemberAuthenticationSurfaceController : SurfaceController
{
private readonly IMemberManager _memberManager;
private readonly IMemberSignInManager _memberSignInManager;
public MemberAuthenticationSurfaceController(IUmbracoContextAccessor umbracoContextAccessor, IUmbracoDatabaseFactory databaseFactory, ServiceContext services, AppCaches appCaches, IProfilingLogger profilingLogger, IPublishedUrlProvider publishedUrlProvider, IMemberManager memberManager, IMemberSignInManager memberSignInManager) : base(umbracoContextAccessor, databaseFactory, services, appCaches, profilingLogger, publishedUrlProvider)
{
_memberManager = memberManager;
_memberSignInManager = memberSignInManager;
}
[ValidateAntiForgeryToken]
[HttpPost]
public async Task<IActionResult> Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (await _memberManager.ValidateCredentialsAsync(model.Username, model.Password))
{
var result = await _memberSignInManager.PasswordSignInAsync(model.Username, model.Password, false, true);
if (result.Succeeded)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
return RedirectToCurrentUmbracoPage();
}
}
else
{
ModelState.AddModelError(string.Empty, "The username or password provided is incorrect.");
}
}
return CurrentUmbracoPage();
}
[HttpGet]
public async Task<IActionResult> Logout()
{
TempData.Clear();
await _memberSignInManager.SignOutAsync();
return RedirectToCurrentUmbracoPage();
}
}
@using Umbraco.Cms.Core.Security
@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage
@inject IMemberManager _memberManager;
@if (_memberManager.IsLoggedIn())
{
@(await Component.InvokeAsync("ClientLogout"))
}
else
{
@(await Component.InvokeAsync("ClientLogin"))
}
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Web.Common.Models;
public class ClientLoginViewComponent : ViewComponent
{
public async Task<IViewComponentResult> InvokeAsync()
{
return View("~/Views/Partials/_Login.cshtml", new LoginModel());
}
}
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
public class ClientLogoutViewComponent : ViewComponent
{
public async Task<IViewComponentResult> InvokeAsync()
{
return View("~/Views/Partials/_Logout.cshtml");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment