Files
Umbraco-CMS/src/Umbraco.Web.BackOffice/Security/InviteUriProvider.cs
Bjarke Berg b8af4bab7d User forgot password functionality for Management API (#14704)
* Added attribute filter to ensure a request is taking a minimum time to response

* Added functionality to management api to send forgot password emails and verify these + do the actual reset using the token

* Renamed UserKey to UserId and updated OpenApi.json

* Update src/Umbraco.Core/Services/IUserService.cs

Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com>

* Cleanup

* Renaming param

* Fixing send user username instead of email + wrong EmailTypes

* Fixed issue with forgot password functionality after reusing other functionality

* Rename prop

* Adding docs and renaming param

* Handle password validation return types

* More cleanup

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com>
2023-08-28 12:14:16 +02:00

60 lines
2.2 KiB
C#

using System.Net;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Options;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.Models.Membership;
using Umbraco.Cms.Core.Security;
using Umbraco.Cms.Core.Services.OperationStatus;
using Umbraco.Cms.Web.BackOffice.Controllers;
using Umbraco.Extensions;
namespace Umbraco.Cms.Web.BackOffice.Security;
public class InviteUriProvider : IInviteUriProvider
{
private readonly LinkGenerator _linkGenerator;
private readonly ICoreBackOfficeUserManager _userManager;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly WebRoutingSettings _webRoutingSettings;
public InviteUriProvider(
LinkGenerator linkGenerator,
ICoreBackOfficeUserManager userManager,
IHttpContextAccessor httpContextAccessor,
IOptions<WebRoutingSettings> webRoutingSettings)
{
_linkGenerator = linkGenerator;
_userManager = userManager;
_httpContextAccessor = httpContextAccessor;
_webRoutingSettings = webRoutingSettings.Value;
}
public async Task<Attempt<Uri, UserOperationStatus>> CreateInviteUriAsync(IUser invitee)
{
Attempt<string, UserOperationStatus> tokenAttempt = await _userManager.GenerateEmailConfirmationTokenAsync(invitee);
if (tokenAttempt.Success is false)
{
return Attempt.FailWithStatus(tokenAttempt.Status, new Uri(string.Empty));
}
string inviteToken = $"{invitee.Key}{WebUtility.UrlEncode("|")}{tokenAttempt.Result.ToUrlBase64()}";
// FIXME: This will need to change.
string? action = _linkGenerator.GetPathByAction(
nameof(BackOfficeController.VerifyInvite),
ControllerExtensions.GetControllerName<BackOfficeController>(),
new { area = Constants.Web.Mvc.BackOfficeArea, invite = inviteToken });
Uri applicationUri = _httpContextAccessor
.GetRequiredHttpContext()
.Request
.GetApplicationUri(_webRoutingSettings);
var inviteUri = new Uri(applicationUri, action);
return Attempt.SucceedWithStatus(UserOperationStatus.Success, inviteUri);
}
}