Deleted MembersRoleProvider. Switched to role store. Made everything single not plural. Fixed formatting.

This commit is contained in:
Emma Garland
2021-03-04 17:29:11 +00:00
parent 4cb9923c24
commit e124ee336a
23 changed files with 187 additions and 292 deletions

View File

@@ -237,6 +237,7 @@ namespace Umbraco.Cms.Core.Models.Mapping
var userRoles = username.IsNullOrWhiteSpace() ? null : _memberService.GetAllRoles(username);
// create a dictionary of all roles (except internal roles) + "false"
//TODO: use MembersRoleStore
var result = _memberGroupService.GetAll()
.Select(x => x.Name)
// if a role starts with __umbracoRole we won't show it as it's an internal role used for public access

View File

@@ -3,7 +3,7 @@ namespace Umbraco.Cms.Core.Security
/// <summary>
/// The user manager for members
/// </summary>
public interface IMemberManager : IUmbracoUserManager<MembersIdentityUser>
public interface IMemberManager : IUmbracoUserManager<MemberIdentityUser>
{
}
}

View File

@@ -42,10 +42,10 @@ namespace Umbraco.Cms.Core.Security
target.EnableChangeTracking();
});
mapper.Define<IMember, MembersIdentityUser>(
mapper.Define<IMember, MemberIdentityUser>(
(source, context) =>
{
var target = new MembersIdentityUser(source.Id);
var target = new MemberIdentityUser(source.Id);
target.DisableChangeTracking();
return target;
},
@@ -94,7 +94,7 @@ namespace Umbraco.Cms.Core.Security
//target.Roles =;
}
private void Map(IMember source, MembersIdentityUser target)
private void Map(IMember source, MemberIdentityUser target)
{
target.Email = source.Email;
target.UserName = source.Username;

View File

@@ -5,18 +5,18 @@ using Microsoft.Extensions.DependencyInjection;
namespace Umbraco.Cms.Core.Security
{
public class MembersIdentityBuilder : IdentityBuilder
public class MemberIdentityBuilder : IdentityBuilder
{
public MembersIdentityBuilder(IServiceCollection services) : base(typeof(MembersIdentityUser), services)
public MemberIdentityBuilder(IServiceCollection services) : base(typeof(MemberIdentityUser), services)
{
}
public MembersIdentityBuilder(Type role, IServiceCollection services) : base(typeof(MembersIdentityUser), role, services)
public MemberIdentityBuilder(Type role, IServiceCollection services) : base(typeof(MemberIdentityUser), role, services)
{
}
/// <summary>
/// Adds a token provider for the <seealso cref="MembersIdentityUser"/>.
/// Adds a token provider for the <seealso cref="MemberIdentityUser"/>.
/// </summary>
/// <param name="providerName">The name of the provider to add.</param>
/// <param name="provider">The type of the <see cref="IUserTwoFactorTokenProvider{UmbracoMembersIdentityUser}"/> to add.</param>
@@ -27,7 +27,7 @@ namespace Umbraco.Cms.Core.Security
{
throw new InvalidOperationException($"Invalid Type for TokenProvider: {provider.FullName}");
}
Services.Configure<MembersIdentityOptions>(options =>
Services.Configure<MemberIdentityOptions>(options =>
{
options.Tokens.ProviderMap[providerName] = new TokenProviderDescriptor(provider);
});

View File

@@ -5,7 +5,7 @@ namespace Umbraco.Cms.Core.Security
/// <summary>
/// Identity options specifically for the Umbraco members identity implementation
/// </summary>
public class MembersIdentityOptions : IdentityOptions
public class MemberIdentityOptions : IdentityOptions
{
}
}

View File

@@ -11,7 +11,7 @@ namespace Umbraco.Cms.Core.Security
/// <summary>
/// The identity user used for the member
/// </summary>
public class MembersIdentityUser : UmbracoIdentityUser
public class MemberIdentityUser : UmbracoIdentityUser
{
private string _name;
private string _passwordConfig;
@@ -23,29 +23,29 @@ namespace Umbraco.Cms.Core.Security
groups => groups.GetHashCode());
/// <summary>
/// Initializes a new instance of the <see cref="MembersIdentityUser"/> class.
/// Initializes a new instance of the <see cref="MemberIdentityUser"/> class.
/// </summary>
public MembersIdentityUser(int userId)
public MemberIdentityUser(int userId)
{
// use the property setters - they do more than just setting a field
Id = UserIdToString(userId);
}
public MembersIdentityUser()
public MemberIdentityUser()
{
}
/// <summary>
/// Used to construct a new instance without an identity
/// </summary>
public static MembersIdentityUser CreateNew(string username, string email, string memberTypeAlias, string name = null)
public static MemberIdentityUser CreateNew(string username, string email, string memberTypeAlias, string name = null)
{
if (string.IsNullOrWhiteSpace(username))
{
throw new ArgumentException("Value cannot be null or whitespace.", nameof(username));
}
var user = new MembersIdentityUser();
var user = new MemberIdentityUser();
user.DisableChangeTracking();
user.UserName = username;
user.Email = email;

View File

@@ -1,5 +1,4 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
@@ -7,7 +6,6 @@ using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Scoping;
using Umbraco.Cms.Core.Services;
namespace Umbraco.Cms.Core.Security
@@ -15,19 +13,12 @@ namespace Umbraco.Cms.Core.Security
/// <summary>
/// A custom user store that uses Umbraco member data
/// </summary>
public class MembersRoleStore : RoleStoreBase<IdentityRole<string>, string, IdentityUserRole<string>, IdentityRoleClaim<string>>
public class MemberRoleStore : RoleStoreBase<IdentityRole<string>, string, IdentityUserRole<string>, IdentityRoleClaim<string>>
{
private readonly IMemberService _memberService;
private readonly IMemberGroupService _memberGroupService;
private readonly IScopeProvider _scopeProvider;
public MembersRoleStore(IMemberService memberService, IMemberGroupService memberGroupService, IScopeProvider scopeProvider, IdentityErrorDescriber describer)
: base(describer)
{
_memberService = memberService ?? throw new ArgumentNullException(nameof(memberService));
_memberGroupService = memberGroupService ?? throw new ArgumentNullException(nameof(memberGroupService));
_scopeProvider = scopeProvider ?? throw new ArgumentNullException(nameof(scopeProvider));
}
public MemberRoleStore(IMemberGroupService memberGroupService, IdentityErrorDescriber describer)
: base(describer) => _memberGroupService = memberGroupService ?? throw new ArgumentNullException(nameof(memberGroupService));
/// <inheritdoc />
public override IQueryable<IdentityRole<string>> Roles
@@ -94,7 +85,7 @@ namespace Umbraco.Cms.Core.Security
}
else
{
//TODO: throw exception when not found, or return failure? And is this the correcet message
//TODO: throw exception when not found, or return failure? And is this the correct message
return Task.FromResult(IdentityResult.Failed(ErrorDescriber.InvalidRoleName(role.Name)));
}
@@ -123,7 +114,7 @@ namespace Umbraco.Cms.Core.Security
}
else
{
//TODO: throw exception when not found, or return failure? And is this the correcet message
//TODO: throw exception when not found, or return failure? And is this the correct message
return Task.FromResult(IdentityResult.Failed(ErrorDescriber.InvalidRoleName(role.Name)));
}
@@ -153,6 +144,8 @@ namespace Umbraco.Cms.Core.Security
return Task.FromResult(memberGroup == null ? null : MapFromMemberGroup(memberGroup));
}
///TODO: are we implementing these claims methods?
/// <inheritdoc />
public override Task<IList<Claim>> GetClaimsAsync(IdentityRole<string> role, CancellationToken cancellationToken = new CancellationToken()) => throw new System.NotImplementedException();

View File

@@ -19,20 +19,20 @@ namespace Umbraco.Cms.Core.Security
/// <summary>
/// A custom user store that uses Umbraco member data
/// </summary>
public class MembersUserStore : UserStoreBase<MembersIdentityUser, IdentityRole<string>, string, IdentityUserClaim<string>, IdentityUserRole<string>, IdentityUserLogin<string>, IdentityUserToken<string>, IdentityRoleClaim<string>>
public class MemberUserStore : UserStoreBase<MemberIdentityUser, IdentityRole<string>, string, IdentityUserClaim<string>, IdentityUserRole<string>, IdentityUserLogin<string>, IdentityUserToken<string>, IdentityRoleClaim<string>>
{
private readonly IMemberService _memberService;
private readonly UmbracoMapper _mapper;
private readonly IScopeProvider _scopeProvider;
/// <summary>
/// Initializes a new instance of the <see cref="MembersUserStore"/> class for the members identity store
/// Initializes a new instance of the <see cref="MemberUserStore"/> class for the members identity store
/// </summary>
/// <param name="memberService">The member service</param>
/// <param name="mapper">The mapper for properties</param>
/// <param name="scopeProvider">The scope provider</param>
/// <param name="describer">The error describer</param>
public MembersUserStore(IMemberService memberService, UmbracoMapper mapper, IScopeProvider scopeProvider, IdentityErrorDescriber describer)
public MemberUserStore(IMemberService memberService, UmbracoMapper mapper, IScopeProvider scopeProvider, IdentityErrorDescriber describer)
: base(describer)
{
_memberService = memberService ?? throw new ArgumentNullException(nameof(memberService));
@@ -45,16 +45,16 @@ namespace Umbraco.Cms.Core.Security
/// </summary>
/// <inheritdoc />
[EditorBrowsable(EditorBrowsableState.Never)]
public override IQueryable<MembersIdentityUser> Users => throw new NotImplementedException();
public override IQueryable<MemberIdentityUser> Users => throw new NotImplementedException();
/// <inheritdoc />
public override Task<string> GetNormalizedUserNameAsync(MembersIdentityUser user, CancellationToken cancellationToken) => GetUserNameAsync(user, cancellationToken);
public override Task<string> GetNormalizedUserNameAsync(MemberIdentityUser user, CancellationToken cancellationToken) => GetUserNameAsync(user, cancellationToken);
/// <inheritdoc />
public override Task SetNormalizedUserNameAsync(MembersIdentityUser user, string normalizedName, CancellationToken cancellationToken) => SetUserNameAsync(user, normalizedName, cancellationToken);
public override Task SetNormalizedUserNameAsync(MemberIdentityUser user, string normalizedName, CancellationToken cancellationToken) => SetUserNameAsync(user, normalizedName, cancellationToken);
/// <inheritdoc />
public override Task<IdentityResult> CreateAsync(MembersIdentityUser user, CancellationToken cancellationToken = default)
public override Task<IdentityResult> CreateAsync(MemberIdentityUser user, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
@@ -100,7 +100,7 @@ namespace Umbraco.Cms.Core.Security
}
/// <inheritdoc />
public override Task<IdentityResult> UpdateAsync(MembersIdentityUser user, CancellationToken cancellationToken = default)
public override Task<IdentityResult> UpdateAsync(MemberIdentityUser user, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
@@ -121,7 +121,7 @@ namespace Umbraco.Cms.Core.Security
if (found != null)
{
// we have to remember whether Logins property is dirty, since the UpdateMemberProperties will reset it.
var isLoginsPropertyDirty = user.IsPropertyDirty(nameof(MembersIdentityUser.Logins));
var isLoginsPropertyDirty = user.IsPropertyDirty(nameof(MemberIdentityUser.Logins));
if (UpdateMemberProperties(found, user))
{
@@ -148,7 +148,7 @@ namespace Umbraco.Cms.Core.Security
}
/// <inheritdoc />
public override Task<IdentityResult> DeleteAsync(MembersIdentityUser user, CancellationToken cancellationToken = default)
public override Task<IdentityResult> DeleteAsync(MemberIdentityUser user, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
@@ -170,10 +170,10 @@ namespace Umbraco.Cms.Core.Security
}
/// <inheritdoc />
public override Task<MembersIdentityUser> FindByIdAsync(string userId, CancellationToken cancellationToken = default) => FindUserAsync(userId, cancellationToken);
public override Task<MemberIdentityUser> FindByIdAsync(string userId, CancellationToken cancellationToken = default) => FindUserAsync(userId, cancellationToken);
/// <inheritdoc />
protected override Task<MembersIdentityUser> FindUserAsync(string userId, CancellationToken cancellationToken)
protected override Task<MemberIdentityUser> FindUserAsync(string userId, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
@@ -181,30 +181,30 @@ namespace Umbraco.Cms.Core.Security
IMember user = _memberService.GetById(UserIdToInt(userId));
if (user == null)
{
return Task.FromResult((MembersIdentityUser)null);
return Task.FromResult((MemberIdentityUser)null);
}
return Task.FromResult(AssignLoginsCallback(_mapper.Map<MembersIdentityUser>(user)));
return Task.FromResult(AssignLoginsCallback(_mapper.Map<MemberIdentityUser>(user)));
}
/// <inheritdoc />
public override Task<MembersIdentityUser> FindByNameAsync(string userName, CancellationToken cancellationToken = default)
public override Task<MemberIdentityUser> FindByNameAsync(string userName, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
IMember user = _memberService.GetByUsername(userName);
if (user == null)
{
return Task.FromResult((MembersIdentityUser)null);
return Task.FromResult((MemberIdentityUser)null);
}
MembersIdentityUser result = AssignLoginsCallback(_mapper.Map<MembersIdentityUser>(user));
MemberIdentityUser result = AssignLoginsCallback(_mapper.Map<MemberIdentityUser>(user));
return Task.FromResult(result);
}
/// <inheritdoc />
public override async Task SetPasswordHashAsync(MembersIdentityUser user, string passwordHash, CancellationToken cancellationToken = default)
public override async Task SetPasswordHashAsync(MemberIdentityUser user, string passwordHash, CancellationToken cancellationToken = default)
{
await base.SetPasswordHashAsync(user, passwordHash, cancellationToken);
@@ -213,7 +213,7 @@ namespace Umbraco.Cms.Core.Security
}
/// <inheritdoc />
public override async Task<bool> HasPasswordAsync(MembersIdentityUser user, CancellationToken cancellationToken = default)
public override async Task<bool> HasPasswordAsync(MemberIdentityUser user, CancellationToken cancellationToken = default)
{
// This checks if it's null
var result = await base.HasPasswordAsync(user, cancellationToken);
@@ -227,28 +227,28 @@ namespace Umbraco.Cms.Core.Security
}
/// <inheritdoc />
public override Task<MembersIdentityUser> FindByEmailAsync(string email, CancellationToken cancellationToken = default)
public override Task<MemberIdentityUser> FindByEmailAsync(string email, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
IMember member = _memberService.GetByEmail(email);
MembersIdentityUser result = member == null
MemberIdentityUser result = member == null
? null
: _mapper.Map<MembersIdentityUser>(member);
: _mapper.Map<MemberIdentityUser>(member);
return Task.FromResult(AssignLoginsCallback(result));
}
/// <inheritdoc />
public override Task<string> GetNormalizedEmailAsync(MembersIdentityUser user, CancellationToken cancellationToken)
public override Task<string> GetNormalizedEmailAsync(MemberIdentityUser user, CancellationToken cancellationToken)
=> GetEmailAsync(user, cancellationToken);
/// <inheritdoc />
public override Task SetNormalizedEmailAsync(MembersIdentityUser user, string normalizedEmail, CancellationToken cancellationToken)
public override Task SetNormalizedEmailAsync(MemberIdentityUser user, string normalizedEmail, CancellationToken cancellationToken)
=> SetEmailAsync(user, normalizedEmail, cancellationToken);
/// <inheritdoc />
public override Task AddLoginAsync(MembersIdentityUser user, UserLoginInfo login, CancellationToken cancellationToken = default)
public override Task AddLoginAsync(MemberIdentityUser user, UserLoginInfo login, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
@@ -271,7 +271,7 @@ namespace Umbraco.Cms.Core.Security
}
/// <inheritdoc />
public override Task RemoveLoginAsync(MembersIdentityUser user, string loginProvider, string providerKey, CancellationToken cancellationToken = default)
public override Task RemoveLoginAsync(MemberIdentityUser user, string loginProvider, string providerKey, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
@@ -290,7 +290,7 @@ namespace Umbraco.Cms.Core.Security
}
/// <inheritdoc />
public override Task<IList<UserLoginInfo>> GetLoginsAsync(MembersIdentityUser user, CancellationToken cancellationToken = default)
public override Task<IList<UserLoginInfo>> GetLoginsAsync(MemberIdentityUser user, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
@@ -308,7 +308,7 @@ namespace Umbraco.Cms.Core.Security
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
MembersIdentityUser user = await FindUserAsync(userId, cancellationToken);
MemberIdentityUser user = await FindUserAsync(userId, cancellationToken);
if (user == null)
{
return null;
@@ -356,7 +356,7 @@ namespace Umbraco.Cms.Core.Security
}
/// <inheritdoc />
public override Task AddToRoleAsync(MembersIdentityUser user, string role, CancellationToken cancellationToken = default)
public override Task AddToRoleAsync(MemberIdentityUser user, string role, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
@@ -387,7 +387,7 @@ namespace Umbraco.Cms.Core.Security
}
/// <inheritdoc/>
public override Task RemoveFromRoleAsync(MembersIdentityUser user, string role, CancellationToken cancellationToken = default)
public override Task RemoveFromRoleAsync(MemberIdentityUser user, string role, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
@@ -420,7 +420,7 @@ namespace Umbraco.Cms.Core.Security
/// <summary>
/// Gets a list of role names the specified user belongs to.
/// </summary>
public override Task<IList<string>> GetRolesAsync(MembersIdentityUser user, CancellationToken cancellationToken = default)
public override Task<IList<string>> GetRolesAsync(MemberIdentityUser user, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
@@ -443,7 +443,7 @@ namespace Umbraco.Cms.Core.Security
/// <summary>
/// Returns true if a user is in the role
/// </summary>
public override Task<bool> IsInRoleAsync(MembersIdentityUser user, string normalizedRoleName, CancellationToken cancellationToken = default)
public override Task<bool> IsInRoleAsync(MemberIdentityUser user, string normalizedRoleName, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
@@ -458,7 +458,7 @@ namespace Umbraco.Cms.Core.Security
/// <summary>
/// Lists all users of a given role.
/// </summary>
public override Task<IList<MembersIdentityUser>> GetUsersInRoleAsync(string normalizedRoleName, CancellationToken cancellationToken = default)
public override Task<IList<MemberIdentityUser>> GetUsersInRoleAsync(string normalizedRoleName, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
@@ -469,7 +469,7 @@ namespace Umbraco.Cms.Core.Security
IEnumerable<IMember> members = _memberService.GetMembersByMemberType(normalizedRoleName);
IList<MembersIdentityUser> membersIdentityUsers = members.Select(x => _mapper.Map<MembersIdentityUser>(x)).ToList();
IList<MemberIdentityUser> membersIdentityUsers = members.Select(x => _mapper.Map<MemberIdentityUser>(x)).ToList();
return Task.FromResult(membersIdentityUsers);
}
@@ -493,7 +493,7 @@ namespace Umbraco.Cms.Core.Security
/// <inheritdoc/>
protected override async Task<IdentityUserRole<string>> FindUserRoleAsync(string userId, string roleId, CancellationToken cancellationToken)
{
MembersIdentityUser user = await FindUserAsync(userId, cancellationToken);
MemberIdentityUser user = await FindUserAsync(userId, cancellationToken);
if (user == null)
{
return null;
@@ -504,7 +504,7 @@ namespace Umbraco.Cms.Core.Security
}
/// <inheritdoc />
public override Task<string> GetSecurityStampAsync(MembersIdentityUser user, CancellationToken cancellationToken = default)
public override Task<string> GetSecurityStampAsync(MemberIdentityUser user, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
@@ -519,7 +519,7 @@ namespace Umbraco.Cms.Core.Security
: user.SecurityStamp);
}
private MembersIdentityUser AssignLoginsCallback(MembersIdentityUser user)
private MemberIdentityUser AssignLoginsCallback(MemberIdentityUser user)
{
if (user != null)
{
@@ -530,12 +530,12 @@ namespace Umbraco.Cms.Core.Security
return user;
}
private bool UpdateMemberProperties(IMember member, MembersIdentityUser identityUserMember)
private bool UpdateMemberProperties(IMember member, MemberIdentityUser identityUserMember)
{
var anythingChanged = false;
// don't assign anything if nothing has changed as this will trigger the track changes of the model
if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.LastLoginDateUtc))
if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.LastLoginDateUtc))
|| (member.LastLoginDate != default && identityUserMember.LastLoginDateUtc.HasValue == false)
|| (identityUserMember.LastLoginDateUtc.HasValue && member.LastLoginDate.ToUniversalTime() != identityUserMember.LastLoginDateUtc.Value))
{
@@ -546,7 +546,7 @@ namespace Umbraco.Cms.Core.Security
member.LastLoginDate = dt;
}
if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.LastPasswordChangeDateUtc))
if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.LastPasswordChangeDateUtc))
|| (member.LastPasswordChangeDate != default && identityUserMember.LastPasswordChangeDateUtc.HasValue == false)
|| (identityUserMember.LastPasswordChangeDateUtc.HasValue && member.LastPasswordChangeDate.ToUniversalTime() != identityUserMember.LastPasswordChangeDateUtc.Value))
{
@@ -554,7 +554,7 @@ namespace Umbraco.Cms.Core.Security
member.LastPasswordChangeDate = identityUserMember.LastPasswordChangeDateUtc.Value.ToLocalTime();
}
if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.EmailConfirmed))
if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.EmailConfirmed))
|| (member.EmailConfirmedDate.HasValue && member.EmailConfirmedDate.Value != default && identityUserMember.EmailConfirmed == false)
|| ((member.EmailConfirmedDate.HasValue == false || member.EmailConfirmedDate.Value == default) && identityUserMember.EmailConfirmed))
{
@@ -562,21 +562,21 @@ namespace Umbraco.Cms.Core.Security
member.EmailConfirmedDate = identityUserMember.EmailConfirmed ? (DateTime?)DateTime.Now : null;
}
if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.Name))
if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.Name))
&& member.Name != identityUserMember.Name && identityUserMember.Name.IsNullOrWhiteSpace() == false)
{
anythingChanged = true;
member.Name = identityUserMember.Name;
}
if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.Email))
if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.Email))
&& member.Email != identityUserMember.Email && identityUserMember.Email.IsNullOrWhiteSpace() == false)
{
anythingChanged = true;
member.Email = identityUserMember.Email;
}
if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.AccessFailedCount))
if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.AccessFailedCount))
&& member.FailedPasswordAttempts != identityUserMember.AccessFailedCount)
{
anythingChanged = true;
@@ -595,14 +595,14 @@ namespace Umbraco.Cms.Core.Security
}
}
if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.UserName))
if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.UserName))
&& member.Username != identityUserMember.UserName && identityUserMember.UserName.IsNullOrWhiteSpace() == false)
{
anythingChanged = true;
member.Username = identityUserMember.UserName;
}
if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.PasswordHash))
if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.PasswordHash))
&& member.RawPasswordValue != identityUserMember.PasswordHash && identityUserMember.PasswordHash.IsNullOrWhiteSpace() == false)
{
anythingChanged = true;
@@ -617,7 +617,7 @@ namespace Umbraco.Cms.Core.Security
}
// TODO: Fix this for Groups too (as per backoffice comment)
if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.Roles)) || identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.Groups)))
if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.Roles)) || identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.Groups)))
{
}
@@ -645,42 +645,42 @@ namespace Umbraco.Cms.Core.Security
/// </summary>
/// <inheritdoc />
[EditorBrowsable(EditorBrowsableState.Never)]
public override Task<IList<Claim>> GetClaimsAsync(MembersIdentityUser user, CancellationToken cancellationToken = default) => throw new NotImplementedException();
public override Task<IList<Claim>> GetClaimsAsync(MemberIdentityUser user, CancellationToken cancellationToken = default) => throw new NotImplementedException();
/// <summary>
/// Not supported in Umbraco
/// </summary>
/// <inheritdoc />
[EditorBrowsable(EditorBrowsableState.Never)]
public override Task AddClaimsAsync(MembersIdentityUser user, IEnumerable<Claim> claims, CancellationToken cancellationToken = default) => throw new NotImplementedException();
public override Task AddClaimsAsync(MemberIdentityUser user, IEnumerable<Claim> claims, CancellationToken cancellationToken = default) => throw new NotImplementedException();
/// <summary>
/// Not supported in Umbraco
/// </summary>
/// <inheritdoc />
[EditorBrowsable(EditorBrowsableState.Never)]
public override Task ReplaceClaimAsync(MembersIdentityUser user, Claim claim, Claim newClaim, CancellationToken cancellationToken = default) => throw new NotImplementedException();
public override Task ReplaceClaimAsync(MemberIdentityUser user, Claim claim, Claim newClaim, CancellationToken cancellationToken = default) => throw new NotImplementedException();
/// <summary>
/// Not supported in Umbraco
/// </summary>
/// <inheritdoc />
[EditorBrowsable(EditorBrowsableState.Never)]
public override Task RemoveClaimsAsync(MembersIdentityUser user, IEnumerable<Claim> claims, CancellationToken cancellationToken = default) => throw new NotImplementedException();
public override Task RemoveClaimsAsync(MemberIdentityUser user, IEnumerable<Claim> claims, CancellationToken cancellationToken = default) => throw new NotImplementedException();
/// <summary>
/// Not supported in Umbraco
/// </summary>
/// <inheritdoc />
[EditorBrowsable(EditorBrowsableState.Never)]
public override Task<IList<MembersIdentityUser>> GetUsersForClaimAsync(Claim claim, CancellationToken cancellationToken = default) => throw new NotImplementedException();
public override Task<IList<MemberIdentityUser>> GetUsersForClaimAsync(Claim claim, CancellationToken cancellationToken = default) => throw new NotImplementedException();
/// <summary>
/// Not supported in Umbraco
/// </summary>
/// <inheritdoc />
[EditorBrowsable(EditorBrowsableState.Never)]
protected override Task<IdentityUserToken<string>> FindTokenAsync(MembersIdentityUser user, string loginProvider, string name, CancellationToken cancellationToken) => throw new NotImplementedException();
protected override Task<IdentityUserToken<string>> FindTokenAsync(MemberIdentityUser user, string loginProvider, string name, CancellationToken cancellationToken) => throw new NotImplementedException();
/// <summary>
/// Not supported in Umbraco

View File

@@ -16,10 +16,10 @@ namespace Umbraco.Tests.Integration.Umbraco.Web.Common
[Test]
public void AddMembersIdentity_ExpectMembersUserStoreResolvable()
{
IUserStore<MembersIdentityUser> userStore = Services.GetService<IUserStore<MembersIdentityUser>>();
IUserStore<MemberIdentityUser> userStore = Services.GetService<IUserStore<MemberIdentityUser>>();
Assert.IsNotNull(userStore);
Assert.AreEqual(typeof(MembersUserStore), userStore.GetType());
Assert.AreEqual(typeof(MemberUserStore), userStore.GetType());
}
[Test]

View File

@@ -19,36 +19,36 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
[TestFixture]
public class MemberIdentityUserManagerTests
{
private Mock<IUserStore<MembersIdentityUser>> _mockMemberStore;
private Mock<IOptions<MembersIdentityOptions>> _mockIdentityOptions;
private Mock<IPasswordHasher<MembersIdentityUser>> _mockPasswordHasher;
private Mock<IUserValidator<MembersIdentityUser>> _mockUserValidators;
private Mock<IEnumerable<IPasswordValidator<MembersIdentityUser>>> _mockPasswordValidators;
private Mock<IUserStore<MemberIdentityUser>> _mockMemberStore;
private Mock<IOptions<MemberIdentityOptions>> _mockIdentityOptions;
private Mock<IPasswordHasher<MemberIdentityUser>> _mockPasswordHasher;
private Mock<IUserValidator<MemberIdentityUser>> _mockUserValidators;
private Mock<IEnumerable<IPasswordValidator<MemberIdentityUser>>> _mockPasswordValidators;
private Mock<ILookupNormalizer> _mockNormalizer;
private IdentityErrorDescriber _mockErrorDescriber;
private Mock<IServiceProvider> _mockServiceProviders;
private Mock<ILogger<UserManager<MembersIdentityUser>>> _mockLogger;
private Mock<ILogger<UserManager<MemberIdentityUser>>> _mockLogger;
private Mock<IOptions<MemberPasswordConfigurationSettings>> _mockPasswordConfiguration;
public MemberManager CreateSut()
{
_mockMemberStore = new Mock<IUserStore<MembersIdentityUser>>();
_mockIdentityOptions = new Mock<IOptions<MembersIdentityOptions>>();
_mockMemberStore = new Mock<IUserStore<MemberIdentityUser>>();
_mockIdentityOptions = new Mock<IOptions<MemberIdentityOptions>>();
var idOptions = new MembersIdentityOptions { Lockout = { AllowedForNewUsers = false } };
var idOptions = new MemberIdentityOptions { Lockout = { AllowedForNewUsers = false } };
_mockIdentityOptions.Setup(o => o.Value).Returns(idOptions);
_mockPasswordHasher = new Mock<IPasswordHasher<MembersIdentityUser>>();
_mockPasswordHasher = new Mock<IPasswordHasher<MemberIdentityUser>>();
var userValidators = new List<IUserValidator<MembersIdentityUser>>();
_mockUserValidators = new Mock<IUserValidator<MembersIdentityUser>>();
var validator = new Mock<IUserValidator<MembersIdentityUser>>();
var userValidators = new List<IUserValidator<MemberIdentityUser>>();
_mockUserValidators = new Mock<IUserValidator<MemberIdentityUser>>();
var validator = new Mock<IUserValidator<MemberIdentityUser>>();
userValidators.Add(validator.Object);
_mockPasswordValidators = new Mock<IEnumerable<IPasswordValidator<MembersIdentityUser>>>();
_mockPasswordValidators = new Mock<IEnumerable<IPasswordValidator<MemberIdentityUser>>>();
_mockNormalizer = new Mock<ILookupNormalizer>();
_mockErrorDescriber = new IdentityErrorDescriber();
_mockServiceProviders = new Mock<IServiceProvider>();
_mockLogger = new Mock<ILogger<UserManager<MembersIdentityUser>>>();
_mockLogger = new Mock<ILogger<UserManager<MemberIdentityUser>>>();
_mockPasswordConfiguration = new Mock<IOptions<MemberPasswordConfigurationSettings>>();
_mockPasswordConfiguration.Setup(x => x.Value).Returns(() =>
new MemberPasswordConfigurationSettings()
@@ -56,9 +56,9 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
});
var pwdValidators = new List<PasswordValidator<MembersIdentityUser>>
var pwdValidators = new List<PasswordValidator<MemberIdentityUser>>
{
new PasswordValidator<MembersIdentityUser>()
new PasswordValidator<MemberIdentityUser>()
};
var userManager = new MemberManager(
@@ -71,12 +71,12 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
new BackOfficeIdentityErrorDescriber(),
_mockServiceProviders.Object,
new Mock<IHttpContextAccessor>().Object,
new Mock<ILogger<UserManager<MembersIdentityUser>>>().Object,
new Mock<ILogger<UserManager<MemberIdentityUser>>>().Object,
_mockPasswordConfiguration.Object);
validator.Setup(v => v.ValidateAsync(
userManager,
It.IsAny<MembersIdentityUser>()))
It.IsAny<MemberIdentityUser>()))
.Returns(Task.FromResult(IdentityResult.Success)).Verifiable();
return userManager;
@@ -87,7 +87,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
{
//arrange
MemberManager sut = CreateSut();
MembersIdentityUser fakeUser = new MembersIdentityUser()
MemberIdentityUser fakeUser = new MemberIdentityUser()
{
PasswordConfig = "testConfig"
};
@@ -148,7 +148,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
{
//arrange
MemberManager sut = CreateSut();
MembersIdentityUser fakeUser = new MembersIdentityUser()
MemberIdentityUser fakeUser = new MemberIdentityUser()
{
PasswordConfig = "testConfig"
};

View File

@@ -20,10 +20,10 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
{
private Mock<IMemberService> _mockMemberService;
public MembersUserStore CreateSut()
public MemberUserStore CreateSut()
{
_mockMemberService = new Mock<IMemberService>();
return new MembersUserStore(
return new MemberUserStore(
_mockMemberService.Object,
new UmbracoMapper(new MapDefinitionCollection(new List<IMapDefinition>())),
new Mock<IScopeProvider>().Object,
@@ -34,7 +34,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
public void GivenICreateUser_AndTheUserIsNull_ThenIShouldGetAFailedResultAsync()
{
// arrange
MembersUserStore sut = CreateSut();
MemberUserStore sut = CreateSut();
CancellationToken fakeCancellationToken = new CancellationToken(){};
// act
@@ -49,8 +49,8 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
public async Task GivenICreateANewUser_AndTheUserIsPopulatedCorrectly_ThenIShouldGetASuccessResultAsync()
{
// arrange
MembersUserStore sut = CreateSut();
var fakeUser = new MembersIdentityUser() { };
MemberUserStore sut = CreateSut();
var fakeUser = new MemberIdentityUser() { };
var fakeCancellationToken = new CancellationToken() { };
IMemberType fakeMemberType = new MemberType(new MockShortStringHelper(), 77);

View File

@@ -16,18 +16,14 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
[TestFixture]
public class MemberRoleStoreTests
{
private Mock<IMemberService> _mockMemberService;
private Mock<IMemberGroupService> _mockMemberGroupService;
private IdentityErrorDescriber ErrorDescriber => new IdentityErrorDescriber();
public MembersRoleStore CreateSut()
public MemberRoleStore CreateSut()
{
_mockMemberService = new Mock<IMemberService>();
_mockMemberGroupService = new Mock<IMemberGroupService>();
return new MembersRoleStore(
_mockMemberService.Object,
return new MemberRoleStore(
_mockMemberGroupService.Object,
new Mock<IScopeProvider>().Object,
ErrorDescriber);
}
@@ -35,7 +31,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
public void GivenICreateAMemberRole_AndTheGroupIsNull_ThenIShouldGetAFailedResultAsync()
{
// arrange
MembersRoleStore sut = CreateSut();
MemberRoleStore sut = CreateSut();
CancellationToken fakeCancellationToken = new CancellationToken() { };
// act
@@ -50,7 +46,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
public async Task GivenICreateAMemberRole_AndTheGroupIsPopulatedCorrectly_ThenIShouldGetASuccessResultAsync()
{
// arrange
MembersRoleStore sut = CreateSut();
MemberRoleStore sut = CreateSut();
var fakeRole = new IdentityRole<string>()
{
Id = "777",
@@ -78,7 +74,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
public async Task GivenIUpdateAMemberRole_AndTheGroupExistsWithTheSameName_ThenIShouldGetASuccessResultAsyncButNoUpdatesMade()
{
// arrange
MembersRoleStore sut = CreateSut();
MemberRoleStore sut = CreateSut();
var fakeRole = new IdentityRole<string>()
{
Id = "777",
@@ -107,7 +103,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
public async Task GivenIUpdateAMemberRole_AndTheGroupExistsWithADifferentSameName_ThenIShouldGetASuccessResultAsyncWithUpdatesMade()
{
// arrange
MembersRoleStore sut = CreateSut();
MemberRoleStore sut = CreateSut();
var fakeRole = new IdentityRole<string>()
{
Id = "777",
@@ -137,7 +133,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
public async Task GivenIUpdateAMemberRole_AndTheGroupDoesntExist_ThenIShouldGetAFailureResultAsync()
{
// arrange
MembersRoleStore sut = CreateSut();
MemberRoleStore sut = CreateSut();
var fakeRole = new IdentityRole<string>()
{
Id = "777",
@@ -161,7 +157,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
public async Task GivenIUpdateAMemberRole_AndTheIdCannotBeParsedToAnInt_ThenIShouldGetAFailureResultAsync()
{
// arrange
MembersRoleStore sut = CreateSut();
MemberRoleStore sut = CreateSut();
var fakeRole = new IdentityRole<string>()
{
Id = "7a77",
@@ -184,7 +180,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
public async Task GivenIDeleteAMemberRole_AndItExists_ThenTheMemberGroupShouldBeDeleted_AndIShouldGetASuccessResultAsync()
{
// arrange
MembersRoleStore sut = CreateSut();
MemberRoleStore sut = CreateSut();
var fakeRole = new IdentityRole<string>()
{
Id = "777",
@@ -211,7 +207,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
public async Task GivenIDeleteAMemberRole_AndTheIdCannotBeParsedToAnInt_ThenTheMemberGroupShouldNotBeDeleted_AndIShouldGetAFailResultAsync()
{
// arrange
MembersRoleStore sut = CreateSut();
MemberRoleStore sut = CreateSut();
var fakeRole = new IdentityRole<string>()
{
Id = "7a77",
@@ -236,7 +232,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
public async Task GivenIDeleteAMemberRole_AndItDoesntExist_ThenTheMemberGroupShouldNotBeDeleted_AndIShouldGetAFailResultAsync()
{
// arrange
MembersRoleStore sut = CreateSut();
MemberRoleStore sut = CreateSut();
var fakeRole = new IdentityRole<string>()
{
Id = "777",
@@ -261,7 +257,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security
public async Task GivenIGetAllMemberRoles_ThenIShouldGetAllMemberGroups_AndASuccessResultAsync()
{
// arrange
MembersRoleStore sut = CreateSut();
MemberRoleStore sut = CreateSut();
var fakeRole = new IdentityRole<string>("fakeGroupName")
{
Id = "777"

View File

@@ -68,7 +68,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
IMemberGroupService memberGroupService,
IDataTypeService dataTypeService,
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
IPasswordChanger<MembersIdentityUser> passwordChanger,
IPasswordChanger<MemberIdentityUser> passwordChanger,
IOptions<GlobalSettings> globalSettings,
IUser user)
{
@@ -78,7 +78,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
sut.ModelState.AddModelError("key", "Invalid model state");
Mock.Get(umbracoMembersUserManager)
.Setup(x => x.CreateAsync(It.IsAny<MembersIdentityUser>(), It.IsAny<string>()))
.Setup(x => x.CreateAsync(It.IsAny<MemberIdentityUser>(), It.IsAny<string>()))
.ReturnsAsync(() => IdentityResult.Success);
Mock.Get(umbracoMembersUserManager)
.Setup(x => x.ValidatePasswordAsync(It.IsAny<string>()))
@@ -107,14 +107,14 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
IDataTypeService dataTypeService,
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
IBackOfficeSecurity backOfficeSecurity,
IPasswordChanger<MembersIdentityUser> passwordChanger,
IPasswordChanger<MemberIdentityUser> passwordChanger,
IOptions<GlobalSettings> globalSettings,
IUser user)
{
// arrange
Member member = SetupMemberTestData(out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew);
Mock.Get(umbracoMembersUserManager)
.Setup(x => x.CreateAsync(It.IsAny<MembersIdentityUser>(), It.IsAny<string>()))
.Setup(x => x.CreateAsync(It.IsAny<MemberIdentityUser>(), It.IsAny<string>()))
.ReturnsAsync(() => IdentityResult.Success);
Mock.Get(umbracoMembersUserManager)
.Setup(x => x.ValidatePasswordAsync(It.IsAny<string>()))
@@ -148,14 +148,14 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
IDataTypeService dataTypeService,
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
IBackOfficeSecurity backOfficeSecurity,
IPasswordChanger<MembersIdentityUser> passwordChanger,
IPasswordChanger<MemberIdentityUser> passwordChanger,
IOptions<GlobalSettings> globalSettings,
IUser user)
{
// arrange
Member member = SetupMemberTestData(out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew);
Mock.Get(umbracoMembersUserManager)
.Setup(x => x.CreateAsync(It.IsAny<MembersIdentityUser>(), It.IsAny<string>()))
.Setup(x => x.CreateAsync(It.IsAny<MemberIdentityUser>(), It.IsAny<string>()))
.ReturnsAsync(() => IdentityResult.Success);
Mock.Get(umbracoMembersUserManager)
.Setup(x => x.ValidatePasswordAsync(It.IsAny<string>()))
@@ -190,13 +190,13 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
IDataTypeService dataTypeService,
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
IBackOfficeSecurity backOfficeSecurity,
IPasswordChanger<MembersIdentityUser> passwordChanger,
IPasswordChanger<MemberIdentityUser> passwordChanger,
IOptions<GlobalSettings> globalSettings,
IUser user)
{
// arrange
Member member = SetupMemberTestData(out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.Save);
var membersIdentityUser = new MembersIdentityUser(123);
var membersIdentityUser = new MemberIdentityUser(123);
Mock.Get(umbracoMembersUserManager)
.Setup(x => x.FindByIdAsync(It.IsAny<string>()))
.ReturnsAsync(() => membersIdentityUser);
@@ -206,7 +206,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
string password = "fakepassword9aw89rnyco3938cyr^%&*()i8Y";
Mock.Get(umbracoMembersUserManager)
.Setup(x => x.UpdateAsync(It.IsAny<MembersIdentityUser>()))
.Setup(x => x.UpdateAsync(It.IsAny<MemberIdentityUser>()))
.ReturnsAsync(() => IdentityResult.Success);
Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias");
Mock.Get(globalSettings);
@@ -242,13 +242,13 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
IDataTypeService dataTypeService,
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
IBackOfficeSecurity backOfficeSecurity,
IPasswordChanger<MembersIdentityUser> passwordChanger,
IPasswordChanger<MemberIdentityUser> passwordChanger,
IOptions<GlobalSettings> globalSettings,
IUser user)
{
// arrange
Member member = SetupMemberTestData(out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.Save);
var membersIdentityUser = new MembersIdentityUser(123);
var membersIdentityUser = new MemberIdentityUser(123);
Mock.Get(umbracoMembersUserManager)
.Setup(x => x.FindByIdAsync(It.IsAny<string>()))
.ReturnsAsync(() => membersIdentityUser);
@@ -257,7 +257,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
.ReturnsAsync(() => IdentityResult.Success);
Mock.Get(umbracoMembersUserManager)
.Setup(x => x.UpdateAsync(It.IsAny<MembersIdentityUser>()))
.Setup(x => x.UpdateAsync(It.IsAny<MemberIdentityUser>()))
.ReturnsAsync(() => IdentityResult.Success);
Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias");
Mock.Get(globalSettings);
@@ -289,7 +289,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
Mock.Get(backOfficeSecurity).Setup(x => x.CurrentUser).Returns(user);
}
private static void SetupPasswordSuccess(IMemberManager umbracoMembersUserManager, IPasswordChanger<MembersIdentityUser> passwordChanger, bool successful = true)
private static void SetupPasswordSuccess(IMemberManager umbracoMembersUserManager, IPasswordChanger<MemberIdentityUser> passwordChanger, bool successful = true)
{
var passwordChanged = new PasswordChangedModel()
{
@@ -322,14 +322,14 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
IDataTypeService dataTypeService,
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
IBackOfficeSecurity backOfficeSecurity,
IPasswordChanger<MembersIdentityUser> passwordChanger,
IPasswordChanger<MemberIdentityUser> passwordChanger,
IOptions<GlobalSettings> globalSettings,
IUser user)
{
// arrange
Member member = SetupMemberTestData(out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew);
Mock.Get(umbracoMembersUserManager)
.Setup(x => x.CreateAsync(It.IsAny<MembersIdentityUser>()))
.Setup(x => x.CreateAsync(It.IsAny<MemberIdentityUser>()))
.ReturnsAsync(() => IdentityResult.Success);
Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias");
Mock.Get(backOfficeSecurityAccessor).Setup(x => x.BackOfficeSecurity).Returns(backOfficeSecurity);
@@ -364,7 +364,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
IDataTypeService dataTypeService,
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
IBackOfficeSecurity backOfficeSecurity,
IPasswordChanger<MembersIdentityUser> passwordChanger,
IPasswordChanger<MemberIdentityUser> passwordChanger,
IOptions<GlobalSettings> globalSettings,
IUser user)
{
@@ -376,7 +376,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
{
roleName
};
var membersIdentityUser = new MembersIdentityUser(123);
var membersIdentityUser = new MemberIdentityUser(123);
Mock.Get(umbracoMembersUserManager)
.Setup(x => x.FindByIdAsync(It.IsAny<string>()))
.ReturnsAsync(() => membersIdentityUser);
@@ -384,7 +384,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
.Setup(x => x.ValidatePasswordAsync(It.IsAny<string>()))
.ReturnsAsync(() => IdentityResult.Success);
Mock.Get(umbracoMembersUserManager)
.Setup(x => x.UpdateAsync(It.IsAny<MembersIdentityUser>()))
.Setup(x => x.UpdateAsync(It.IsAny<MemberIdentityUser>()))
.ReturnsAsync(() => IdentityResult.Success);
Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias");
Mock.Get(backOfficeSecurityAccessor).Setup(x => x.BackOfficeSecurity).Returns(backOfficeSecurity);
@@ -429,10 +429,10 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
IMemberService memberService,
IMemberTypeService memberTypeService,
IMemberGroupService memberGroupService,
IUmbracoUserManager<MembersIdentityUser> membersUserManager,
IUmbracoUserManager<MemberIdentityUser> membersUserManager,
IDataTypeService dataTypeService,
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
IPasswordChanger<MembersIdentityUser> passwordChanger,
IPasswordChanger<MemberIdentityUser> passwordChanger,
IOptions<GlobalSettings> globalSettings,
IUser user)
{

View File

@@ -2435,6 +2435,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers
.Select(_umbracoMapper.Map<MemberDisplay>)
.ToArray();
//TODO: change to role store
var allGroups = _memberGroupService.GetAll().ToArray();
var groups = entry.Rules
.Where(rule => rule.RuleType == Constants.Conventions.PublicAccess.MemberRoleRuleType)

View File

@@ -57,7 +57,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers
private readonly IBackOfficeSecurityAccessor _backOfficeSecurityAccessor;
private readonly IJsonSerializer _jsonSerializer;
private readonly IShortStringHelper _shortStringHelper;
private readonly IPasswordChanger<MembersIdentityUser> _passwordChanger;
private readonly IPasswordChanger<MemberIdentityUser> _passwordChanger;
/// <summary>
/// Initializes a new instance of the <see cref="MemberController"/> class.
@@ -90,7 +90,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers
IDataTypeService dataTypeService,
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
IJsonSerializer jsonSerializer,
IPasswordChanger<MembersIdentityUser> passwordChanger)
IPasswordChanger<MemberIdentityUser> passwordChanger)
: base(cultureDictionary, loggerFactory, shortStringHelper, eventMessages, localizedTextService, jsonSerializer)
{
_propertyEditors = propertyEditors;
@@ -355,7 +355,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers
throw new InvalidOperationException($"No member type found with alias {contentItem.ContentTypeAlias}");
}
var identityMember = MembersIdentityUser.CreateNew(
var identityMember = MemberIdentityUser.CreateNew(
contentItem.Username,
contentItem.Email,
memberType.Alias,
@@ -445,7 +445,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers
ModelState.AddModelError("custom", "An admin cannot lock a user");
}
MembersIdentityUser identityMember = await _memberManager.FindByIdAsync(contentItem.Id.ToString());
MemberIdentityUser identityMember = await _memberManager.FindByIdAsync(contentItem.Id.ToString());
if (identityMember == null)
{
return new ValidationErrorResult("Identity member was not found");
@@ -586,7 +586,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers
/// </summary>
/// <param name="contentItem">The member content item</param>
/// <param name="identityMember">The member as an identity user</param>
private async Task AddOrUpdateRoles(MemberSave contentItem, MembersIdentityUser identityMember)
private async Task AddOrUpdateRoles(MemberSave contentItem, MemberIdentityUser identityMember)
{
// We're gonna look up the current roles now because the below code can cause
// events to be raised and developers could be manually adding roles to members in

View File

@@ -1,7 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Mapping;
@@ -26,17 +28,19 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers
private readonly IMemberGroupService _memberGroupService;
private readonly UmbracoMapper _umbracoMapper;
private readonly ILocalizedTextService _localizedTextService;
private readonly RoleManager<IdentityRole<string>> _roleManager;
public MemberGroupController(
IMemberGroupService memberGroupService,
UmbracoMapper umbracoMapper,
ILocalizedTextService localizedTextService
ILocalizedTextService localizedTextService,
RoleManager<IdentityRole<string>> roleManager
)
{
_memberGroupService = memberGroupService ?? throw new ArgumentNullException(nameof(memberGroupService));
_roleManager = roleManager ?? throw new ArgumentNullException(nameof(roleManager));
_umbracoMapper = umbracoMapper ?? throw new ArgumentNullException(nameof(umbracoMapper));
_localizedTextService =
localizedTextService ?? throw new ArgumentNullException(nameof(localizedTextService));
_localizedTextService = localizedTextService ?? throw new ArgumentNullException(nameof(localizedTextService));
}
/// <summary>
@@ -46,13 +50,13 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers
/// <returns></returns>
public ActionResult<MemberGroupDisplay> GetById(int id)
{
var memberGroup = _memberGroupService.GetById(id);
IdentityRole<string> memberGroup = _roleManager.FindByIdAsync(id.ToString()).Result;
if (memberGroup == null)
{
return NotFound();
}
var dto = _umbracoMapper.Map<IMemberGroup, MemberGroupDisplay>(memberGroup);
MemberGroupDisplay dto = _umbracoMapper.Map<IdentityRole<string>, MemberGroupDisplay>(memberGroup);
return dto;
}
@@ -64,7 +68,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers
/// <returns></returns>
public ActionResult<MemberGroupDisplay> GetById(Guid id)
{
var memberGroup = _memberGroupService.GetById(id);
IMemberGroup memberGroup = _memberGroupService.GetById(id);
if (memberGroup == null)
{
return NotFound();
@@ -82,9 +86,11 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers
{
var guidUdi = id as GuidUdi;
if (guidUdi == null)
{
return NotFound();
}
var memberGroup = _memberGroupService.GetById(guidUdi.Guid);
IMemberGroup memberGroup = _memberGroupService.GetById(guidUdi.Guid);
if (memberGroup == null)
{
return NotFound();
@@ -95,15 +101,22 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers
public IEnumerable<MemberGroupDisplay> GetByIds([FromQuery]int[] ids)
{
return _memberGroupService.GetByIds(ids)
.Select(_umbracoMapper.Map<IMemberGroup, MemberGroupDisplay>);
var roles = new List<IdentityRole<string>>();
foreach (int id in ids)
{
Task<IdentityRole<string>> role = _roleManager.FindByIdAsync(id.ToString());
roles.Add(role.Result);
}
return roles.Select(x=> _umbracoMapper.Map<IdentityRole<string>, MemberGroupDisplay>(x));
}
[HttpDelete]
[HttpPost]
public IActionResult DeleteById(int id)
{
var memberGroup = _memberGroupService.GetById(id);
IMemberGroup memberGroup = _memberGroupService.GetById(id);
if (memberGroup == null)
{
return NotFound();
@@ -113,11 +126,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers
return Ok();
}
public IEnumerable<MemberGroupDisplay> GetAllGroups()
{
return _memberGroupService.GetAll()
.Select(_umbracoMapper.Map<IMemberGroup, MemberGroupDisplay>);
}
public IEnumerable<MemberGroupDisplay> GetAllGroups() => _roleManager.Roles.Select(x => _umbracoMapper.Map<IdentityRole<string>, MemberGroupDisplay>(x));
public MemberGroupDisplay GetEmpty()
{

View File

@@ -86,7 +86,7 @@ namespace Umbraco.Extensions
builder.Services.AddUnique<BackOfficeExternalLoginProviderErrorMiddleware>();
builder.Services.AddUnique<IBackOfficeAntiforgery, BackOfficeAntiforgery>();
builder.Services.AddUnique<IPasswordChanger<BackOfficeIdentityUser>, PasswordChanger<BackOfficeIdentityUser>>();
builder.Services.AddUnique<IPasswordChanger<MembersIdentityUser>, PasswordChanger<MembersIdentityUser>>();
builder.Services.AddUnique<IPasswordChanger<MemberIdentityUser>, PasswordChanger<MemberIdentityUser>>();
return builder;
}

View File

@@ -32,6 +32,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees
_memberGroupService = memberGroupService;
}
//TODO: change to role store
protected override IEnumerable<TreeNode> GetTreeNodesFromService(string id, FormCollection queryStrings)
{
return _memberGroupService.GetAll()
@@ -49,6 +50,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees
var root = rootResult.Value;
//check if there are any groups
//TODO: change to role store
root.HasChildren = _memberGroupService.GetAll().Any();
return root;
}

View File

@@ -65,17 +65,17 @@ namespace Umbraco.Extensions
public static void AddMembersIdentity(this IServiceCollection services) =>
services.BuildMembersIdentity()
.AddDefaultTokenProviders()
.AddUserStore<MembersUserStore>()
.AddUserStore<MemberUserStore>()
.AddMembersManager<IMemberManager, MemberManager>();
private static MembersIdentityBuilder BuildMembersIdentity(this IServiceCollection services)
private static MemberIdentityBuilder BuildMembersIdentity(this IServiceCollection services)
{
// Services used by Umbraco members identity
services.TryAddScoped<IUserValidator<MembersIdentityUser>, UserValidator<MembersIdentityUser>>();
services.TryAddScoped<IPasswordValidator<MembersIdentityUser>, PasswordValidator<MembersIdentityUser>>();
services.TryAddScoped<IPasswordHasher<MembersIdentityUser>, PasswordHasher<MembersIdentityUser>>();
return new MembersIdentityBuilder(services);
services.TryAddScoped<IUserValidator<MemberIdentityUser>, UserValidator<MemberIdentityUser>>();
services.TryAddScoped<IPasswordValidator<MemberIdentityUser>, PasswordValidator<MemberIdentityUser>>();
services.TryAddScoped<IPasswordHasher<MemberIdentityUser>, PasswordHasher<MemberIdentityUser>>();
return new MemberIdentityBuilder(services);
}
private static void RemoveIntParamenterIfValueGreatherThen(IDictionary<string, string> commands, string parameter, int maxValue)

View File

@@ -10,13 +10,13 @@ namespace Umbraco.Extensions
public static class IdentityBuilderExtensions
{
/// <summary>
/// Adds a <see cref="UserManager{TUser}"/> for the <seealso cref="MembersIdentityUser"/>.
/// Adds a <see cref="UserManager{TUser}"/> for the <seealso cref="MemberIdentityUser"/>.
/// </summary>
/// <typeparam name="TInterface">The usermanager interface</typeparam>
/// <typeparam name="TUserManager">The usermanager type</typeparam>
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
public static IdentityBuilder AddMembersManager<TInterface, TUserManager>(this IdentityBuilder identityBuilder)
where TUserManager : UserManager<MembersIdentityUser>, TInterface
where TUserManager : UserManager<MemberIdentityUser>, TInterface
{
identityBuilder.Services.AddScoped(typeof(TInterface), typeof(TUserManager));
return identityBuilder;

View File

@@ -16,21 +16,21 @@ using Umbraco.Extensions;
namespace Umbraco.Cms.Web.Common.Security
{
public class MemberManager : UmbracoUserManager<MembersIdentityUser, MemberPasswordConfigurationSettings>, IMemberManager
public class MemberManager : UmbracoUserManager<MemberIdentityUser, MemberPasswordConfigurationSettings>, IMemberManager
{
private readonly IHttpContextAccessor _httpContextAccessor;
public MemberManager(
IIpResolver ipResolver,
IUserStore<MembersIdentityUser> store,
IOptions<MembersIdentityOptions> optionsAccessor,
IPasswordHasher<MembersIdentityUser> passwordHasher,
IEnumerable<IUserValidator<MembersIdentityUser>> userValidators,
IEnumerable<IPasswordValidator<MembersIdentityUser>> passwordValidators,
IUserStore<MemberIdentityUser> store,
IOptions<MemberIdentityOptions> optionsAccessor,
IPasswordHasher<MemberIdentityUser> passwordHasher,
IEnumerable<IUserValidator<MemberIdentityUser>> userValidators,
IEnumerable<IPasswordValidator<MemberIdentityUser>> passwordValidators,
BackOfficeIdentityErrorDescriber errors,
IServiceProvider services,
IHttpContextAccessor httpContextAccessor,
ILogger<UserManager<MembersIdentityUser>> logger,
ILogger<UserManager<MemberIdentityUser>> logger,
IOptions<MemberPasswordConfigurationSettings> passwordConfiguration)
: base(ipResolver, store, optionsAccessor, passwordHasher, userValidators, passwordValidators, errors, services, logger, passwordConfiguration)
{

View File

@@ -1,106 +0,0 @@
using System;
using System.Configuration.Provider;
using System.Linq;
using System.Web.Security;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Persistence.Querying;
using Umbraco.Cms.Core.Services;
using Umbraco.Web.Composing;
namespace Umbraco.Web.Security.Providers
{
//TODO: Delete: should not be used
[Obsolete("We are now using ASP.NET Core Identity instead of membership providers")]
public class MembersRoleProvider : RoleProvider
{
private readonly IMembershipRoleService<IMember> _roleService;
private string _applicationName;
public MembersRoleProvider(IMembershipRoleService<IMember> roleService)
{
_roleService = roleService;
}
public MembersRoleProvider()
: this(Current.Services.MemberService)
{
}
public override bool IsUserInRole(string username, string roleName)
{
return GetRolesForUser(username).Any(x => x == roleName);
}
public override string[] GetRolesForUser(string username)
{
return _roleService.GetAllRoles(username).ToArray();
}
public override void CreateRole(string roleName)
{
_roleService.AddRole(roleName);
}
public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
return _roleService.DeleteRole(roleName, throwOnPopulatedRole);
}
/// <summary>
/// Returns true if the specified member role name exists
/// </summary>
/// <param name="roleName">Member role name</param>
/// <returns>True if member role exists, otherwise false</returns>
public override bool RoleExists(string roleName) => _roleService.GetAllRoles().Any(x => x.Name == roleName);
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
_roleService.AssignRoles(usernames, roleNames);
}
public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
_roleService.DissociateRoles(usernames, roleNames);
}
public override string[] GetUsersInRole(string roleName)
{
return _roleService.GetMembersInRole(roleName).Select(x => x.Username).ToArray();
}
/// <summary>
/// Gets all the member roles
/// </summary>
/// <returns>A list of member roles</returns>
public override string[] GetAllRoles() => _roleService.GetAllRoles().Select(x => x.Name).ToArray();
public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
return _roleService.FindMembersInRole(roleName, usernameToMatch, StringPropertyMatchType.Wildcard).Select(x => x.Username).ToArray();
}
/// <summary>
/// The name of the application using the custom role provider.
/// </summary>
/// <value></value>
/// <returns>The name of the application using the custom membership provider.</returns>
public override string ApplicationName
{
get
{
return _applicationName;
}
set
{
if (string.IsNullOrEmpty(value))
throw new ProviderException("ApplicationName cannot be empty.");
if (value.Length > 0x100)
throw new ProviderException("Provider application name too long.");
_applicationName = value;
}
}
}
}

View File

@@ -176,7 +176,6 @@
<Compile Include="Security\MembershipHelper.cs" />
<Compile Include="HttpCookieExtensions.cs" />
<Compile Include="Security\Providers\MembersMembershipProvider.cs" />
<Compile Include="Security\Providers\MembersRoleProvider.cs" />
<Compile Include="Security\Providers\UmbracoMembershipProvider.cs" />
<Compile Include="HttpRequestExtensions.cs" />
<Compile Include="UrlHelperExtensions.cs" />
@@ -229,4 +228,4 @@
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>
</Project>