Files
Umbraco-CMS/src/Umbraco.Web.Website/Controllers/UmbRegisterController.cs

129 lines
4.8 KiB
C#
Raw Normal View History

2021-03-26 00:22:11 +11:00
using System;
using System.Linq;
using System.Threading.Tasks;
2021-03-26 00:22:11 +11:00
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Core.Cache;
using Umbraco.Cms.Core.Logging;
2021-03-26 00:22:11 +11:00
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.Security;
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;
2021-02-10 11:42:04 +01:00
using Umbraco.Cms.Web.Common.Filters;
2021-03-26 00:22:11 +11:00
using Umbraco.Cms.Web.Common.Security;
using Umbraco.Extensions;
2018-03-27 10:04:07 +02:00
namespace Umbraco.Cms.Web.Website.Controllers
2018-06-29 19:52:40 +02:00
{
public class UmbRegisterController : SurfaceController
{
2021-03-26 00:22:11 +11:00
private readonly MemberManager _memberManager;
private readonly IMemberService _memberService;
2018-07-06 17:36:33 +02:00
2021-03-26 00:22:11 +11:00
public UmbRegisterController(
MemberManager memberManager,
IMemberService memberService,
IUmbracoContextAccessor umbracoContextAccessor,
IUmbracoDatabaseFactory databaseFactory,
ServiceContext services,
AppCaches appCaches,
IProfilingLogger profilingLogger,
IPublishedUrlProvider publishedUrlProvider)
: base(umbracoContextAccessor, databaseFactory, services, appCaches, profilingLogger, publishedUrlProvider)
{
2021-03-26 00:22:11 +11:00
_memberManager = memberManager;
_memberService = memberService;
}
2018-07-06 17:36:33 +02:00
2018-06-29 19:52:40 +02:00
[HttpPost]
Merge remote-tracking branch 'origin/dev-v7' into temp8 # Conflicts: # .editorconfig # .gitignore # src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs # src/Umbraco.Core/Persistence/Repositories/UserRepository.cs # src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js # src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-era-button.less # src/Umbraco.Web.UI.Client/src/views/common/dialogs/login.html # src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.controller.js # src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/compositions/compositions.html # src/Umbraco.Web.UI.Client/src/views/content/content.delete.controller.js # src/Umbraco.Web.UI.Client/src/views/content/content.restore.controller.js # src/Umbraco.Web.UI.Client/src/views/content/restore.html # src/Umbraco.Web.UI.Client/src/views/dashboard/developer/healthcheck.html # src/Umbraco.Web.UI.Client/src/views/media/media.move.controller.js # src/Umbraco.Web.UI.Client/src/views/media/move.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/layoutconfig.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/rowconfig.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.html # src/Umbraco.Web.UI/Umbraco/config/lang/da.xml # src/Umbraco.Web.UI/config/umbracoSettings.Release.config # src/Umbraco.Web.UI/umbraco/config/lang/en.xml # src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml # src/Umbraco.Web/Controllers/UmbLoginController.cs # src/Umbraco.Web/Controllers/UmbLoginStatusController.cs # src/Umbraco.Web/Controllers/UmbProfileController.cs # src/Umbraco.Web/Controllers/UmbRegisterController.cs # src/Umbraco.Web/Editors/ContentController.cs # src/Umbraco.Web/Editors/ContentTypeControllerBase.cs # src/Umbraco.Web/HtmlHelperRenderExtensions.cs # src/Umbraco.Web/Trees/ContentTreeController.cs # src/Umbraco.Web/Trees/MediaTreeController.cs # src/Umbraco.Web/umbraco.presentation/umbraco/create/XsltTasks.cs # src/Umbraco.Web/umbraco.presentation/umbraco/create/xslt.ascx.cs # src/Umbraco.Web/umbraco.presentation/umbraco/developer/Xslt/editXslt.aspx.cs # src/Umbraco.Web/umbraco.presentation/umbraco/webservices/codeEditorSave.asmx.cs
2018-12-20 16:58:01 +11:00
[ValidateAntiForgeryToken]
[ValidateUmbracoFormRouteString]
public async Task<IActionResult> HandleRegisterMember([Bind(Prefix = "registerModel")]RegisterModel model)
2018-06-29 19:52:40 +02:00
{
if (ModelState.IsValid == false)
{
return CurrentUmbracoPage();
}
// U4-10762 Server error with "Register Member" snippet (Cannot save member with empty name)
// If name field is empty, add the email address instead.
2018-06-29 19:52:40 +02:00
if (string.IsNullOrEmpty(model.Name) && string.IsNullOrEmpty(model.Email) == false)
{
model.Name = model.Email;
}
2021-03-26 00:22:11 +11:00
IdentityResult result = await RegisterMemberAsync(model, model.LoginOnSuccess);
if (result.Succeeded)
{
TempData["FormSuccess"] = true;
// If there is a specified path to redirect to then use it.
if (model.RedirectUrl.IsNullOrWhiteSpace() == false)
{
return Redirect(model.RedirectUrl);
}
2018-06-29 19:52:40 +02:00
2021-03-26 00:22:11 +11:00
// Redirect to current page by default.
return RedirectToCurrentUmbracoPage();
}
else
2018-06-29 19:52:40 +02:00
{
2021-03-26 00:22:11 +11:00
AddModelErrors(result, "registerModel");
return CurrentUmbracoPage();
}
}
2018-06-29 19:52:40 +02:00
2021-03-26 00:22:11 +11:00
private void AddModelErrors(IdentityResult result, string prefix = "")
{
foreach (IdentityError error in result.Errors)
{
ModelState.AddModelError(prefix, error.Description);
}
}
/// <summary>
/// Registers a new member.
/// </summary>
/// <param name="model">Register member model.</param>
/// <param name="logMemberIn">Flag for whether to log the member in upon successful registration.</param>
/// <returns>Result of registration operation.</returns>
private async Task<IdentityResult> RegisterMemberAsync(RegisterModel model, bool logMemberIn = true)
{
model.Username = (model.UsernameIsEmail || model.Username == null) ? model.Email : model.Username;
2018-06-29 19:52:40 +02:00
2021-03-26 00:22:11 +11:00
var identityUser = MembersIdentityUser.CreateNew(model.Username, model.Email, model.MemberTypeAlias, model.Name);
IdentityResult identityResult = await _memberManager.CreateAsync(
identityUser,
model.Password);
if (identityResult.Succeeded)
{
// Update the custom properties
// TODO: See TODO in MembersIdentityUser, Should we support custom member properties for persistence/retrieval?
IMember member = _memberService.GetByUsername(identityUser.UserName);
if (model.MemberProperties != null)
{
foreach (UmbracoProperty property in model.MemberProperties.Where(p => p.Value != null)
.Where(property => member.Properties.Contains(property.Alias)))
2018-06-29 19:52:40 +02:00
{
2021-03-26 00:22:11 +11:00
member.Properties[property.Alias].SetValue(property.Value);
2018-06-29 19:52:40 +02:00
}
2021-03-26 00:22:11 +11:00
}
_memberService.Save(member);
2018-06-29 19:52:40 +02:00
2021-03-26 00:22:11 +11:00
if (logMemberIn)
{
// TODO: Log them in
throw new NotImplementedException("Implement MemberSignInManager");
}
2018-06-29 19:52:40 +02:00
}
2021-03-26 00:22:11 +11:00
return identityResult;
2018-06-29 19:52:40 +02:00
}
}
}