diff --git a/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityRole.cs b/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityRole.cs index 8d0e73a2f1..400fa49053 100644 --- a/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityRole.cs +++ b/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityRole.cs @@ -4,6 +4,7 @@ using System.Collections.ObjectModel; using System.Security.Claims; using JetBrains.Annotations; using Volo.Abp.Domain.Entities; +using Volo.Abp.Guids; using Volo.ExtensionMethods.Collections.Generic; namespace Volo.Abp.Identity @@ -57,20 +58,22 @@ namespace Volo.Abp.Identity ConcurrencyStamp = Guid.NewGuid().ToString(); } - public void AddClaim([NotNull] Claim claim) + public void AddClaim([NotNull] IGuidGenerator guidGenerator, [NotNull] Claim claim) { + Check.NotNull(guidGenerator, nameof(guidGenerator)); Check.NotNull(claim, nameof(claim)); - Claims.Add(new IdentityRoleClaim(Id, claim)); + Claims.Add(new IdentityRoleClaim(guidGenerator.Create(), Id, claim)); } - public void AddClaims([NotNull] IEnumerable claims) + public void AddClaims([NotNull] IGuidGenerator guidGenerator, [NotNull] IEnumerable claims) { + Check.NotNull(guidGenerator, nameof(guidGenerator)); Check.NotNull(claims, nameof(claims)); foreach (var claim in claims) { - AddClaim(claim); + AddClaim(guidGenerator, claim); } } diff --git a/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityRoleClaim.cs b/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityRoleClaim.cs index 07d725b4a5..726e4b35fd 100644 --- a/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityRoleClaim.cs +++ b/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityRoleClaim.cs @@ -33,21 +33,17 @@ namespace Volo.Abp.Identity } - public IdentityRoleClaim(Guid roleId, [NotNull] Claim claim) + public IdentityRoleClaim(Guid id, Guid roleId, [NotNull] Claim claim) + : this(id, roleId, claim.Type, claim.Value) { - //TODO: Where to set Id? - Check.NotNull(claim, nameof(claim)); - - RoleId = roleId; - ClaimType = claim.Type; - ClaimValue = claim.Value; } - public IdentityRoleClaim(Guid roleId, [NotNull] string claimType, string claimValue) + public IdentityRoleClaim(Guid id, Guid roleId, [NotNull] string claimType, string claimValue) { Check.NotNull(claimType, nameof(claimType)); + Id = id; RoleId = roleId; ClaimType = claimType; ClaimValue = claimValue; diff --git a/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUser.cs b/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUser.cs index 7074f1dc44..0328f66e85 100644 --- a/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUser.cs +++ b/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUser.cs @@ -6,13 +6,14 @@ using System.Security.Claims; using JetBrains.Annotations; using Microsoft.AspNetCore.Identity; using Volo.Abp.Domain.Entities; +using Volo.Abp.Guids; using Volo.ExtensionMethods.Collections.Generic; namespace Volo.Abp.Identity { //TODO: Properties should not be public! //TODO: Add Name/Surname/FullName? - + public class IdentityUser : AggregateRoot, IHasConcurrencyStamp { public const int MaxUserNameLength = 256; @@ -133,7 +134,7 @@ namespace Volo.Abp.Identity ConcurrencyStamp = Guid.NewGuid().ToString(); } - public void AddRole(Guid roleId) + public void AddRole(IGuidGenerator guidGenerator, Guid roleId) { Check.NotNull(roleId, nameof(roleId)); @@ -142,19 +143,19 @@ namespace Volo.Abp.Identity return; } - Roles.Add(new IdentityUserRole(Id, roleId)); + Roles.Add(new IdentityUserRole(guidGenerator.Create(), Id, roleId)); } public void RemoveRole(Guid roleId) { Check.NotNull(roleId, nameof(roleId)); - if (Roles.All(r => r.RoleId != roleId)) + if (!IsInRole(roleId)) { return; } - Roles.Add(new IdentityUserRole(Id, roleId)); + Roles.RemoveAll(r => r.RoleId == roleId); } public bool IsInRole(Guid roleId) @@ -164,20 +165,22 @@ namespace Volo.Abp.Identity return Roles.Any(r => r.RoleId == roleId); } - public void AddClaim([NotNull] Claim claim) + public void AddClaim([NotNull] IGuidGenerator guidGenerator, [NotNull] Claim claim) { + Check.NotNull(guidGenerator, nameof(guidGenerator)); Check.NotNull(claim, nameof(claim)); - Claims.Add(new IdentityUserClaim(Id, claim)); + Claims.Add(new IdentityUserClaim(guidGenerator.Create(), Id, claim)); } - public void AddClaims([NotNull] IEnumerable claims) + public void AddClaims([NotNull] IGuidGenerator guidGenerator, [NotNull] IEnumerable claims) { + Check.NotNull(guidGenerator, nameof(guidGenerator)); Check.NotNull(claims, nameof(claims)); foreach (var claim in claims) { - AddClaim(claim); + AddClaim(guidGenerator, claim); } } @@ -210,11 +213,12 @@ namespace Volo.Abp.Identity Claims.RemoveAll(c => c.ClaimValue == claim.Value && c.ClaimType == claim.Type); } - public void AddLogin([NotNull] UserLoginInfo login) + public void AddLogin([NotNull] IGuidGenerator guidGenerator, [NotNull] UserLoginInfo login) { + Check.NotNull(guidGenerator, nameof(guidGenerator)); Check.NotNull(login, nameof(login)); - Logins.Add(new IdentityUserLogin(Id, login)); + Logins.Add(new IdentityUserLogin(guidGenerator.Create(), Id, login)); } public void RemoveLogin([NotNull] string loginProvider, [NotNull] string providerKey) @@ -231,13 +235,12 @@ namespace Volo.Abp.Identity return Tokens.FirstOrDefault(t => t.LoginProvider == loginProvider && t.Name == name); } - public void SetToken(string loginProvider, string name, string value) + public void SetToken(IGuidGenerator guidGenerator, string loginProvider, string name, string value) { var token = FindToken(loginProvider, name); if (token == null) { - - Tokens.Add(new IdentityUserToken(Id, loginProvider, name, value)); + Tokens.Add(new IdentityUserToken(guidGenerator.Create(), Id, loginProvider, name, value)); } else { diff --git a/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserClaim.cs b/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserClaim.cs index e0100f809a..b40b736443 100644 --- a/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserClaim.cs +++ b/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserClaim.cs @@ -33,21 +33,17 @@ namespace Volo.Abp.Identity } - public IdentityUserClaim(Guid userId, [NotNull] Claim claim) + public IdentityUserClaim(Guid id, Guid userId, [NotNull] Claim claim) + : this(id, userId, claim.Type, claim.Value) { - //TODO: Where to set Id? - Check.NotNull(claim, nameof(claim)); - - UserId = userId; - ClaimType = claim.Type; - ClaimValue = claim.Value; } - public IdentityUserClaim(Guid userId, [NotNull] string claimType, string claimValue) + public IdentityUserClaim(Guid id, Guid userId, [NotNull] string claimType, string claimValue) { Check.NotNull(claimType, nameof(claimType)); + Id = id; UserId = userId; ClaimType = claimType; ClaimValue = claimValue; diff --git a/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserLogin.cs b/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserLogin.cs index c84edd1546..aa897f87b8 100644 --- a/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserLogin.cs +++ b/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserLogin.cs @@ -41,27 +41,22 @@ namespace Volo.Abp.Identity } - public IdentityUserLogin(Guid userId, [NotNull] string loginProvider, [NotNull] string providerKey, string providerDisplayName) + public IdentityUserLogin(Guid id, Guid userId, [NotNull] string loginProvider, [NotNull] string providerKey, string providerDisplayName) { Check.NotNull(loginProvider, nameof(loginProvider)); Check.NotNull(providerKey, nameof(providerKey)); - //TODO: Where to set Id? - + Id = id; UserId = userId; LoginProvider = loginProvider; ProviderKey = providerKey; ProviderDisplayName = providerDisplayName; } - public IdentityUserLogin(Guid userId, UserLoginInfo login) + public IdentityUserLogin(Guid id, Guid userId, [NotNull] UserLoginInfo login) + : this(id, userId, login.LoginProvider, login.ProviderKey, login.ProviderDisplayName) { - Check.NotNull(login, nameof(login)); - UserId = userId; - LoginProvider = login.LoginProvider; - ProviderKey = login.ProviderKey; - ProviderDisplayName = login.ProviderDisplayName; } public UserLoginInfo ToUserLoginInfo() diff --git a/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserRole.cs b/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserRole.cs index 798dc6fb64..d993b5e5bf 100644 --- a/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserRole.cs +++ b/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserRole.cs @@ -23,10 +23,9 @@ namespace Volo.Abp.Identity } - public IdentityUserRole(Guid userId, Guid roleId) + public IdentityUserRole(Guid id, Guid userId, Guid roleId) { - //TODO: Where to set Id? - + Id = id; UserId = userId; RoleId = roleId; } diff --git a/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserToken.cs b/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserToken.cs index 0ea06323be..5d9005ec7b 100644 --- a/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserToken.cs +++ b/src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserToken.cs @@ -36,13 +36,12 @@ namespace Volo.Abp.Identity } - public IdentityUserToken(Guid userId, [NotNull] string loginProvider, [NotNull] string name, string value) + public IdentityUserToken(Guid id, Guid userId, [NotNull] string loginProvider, [NotNull] string name, string value) { Check.NotNull(loginProvider, nameof(loginProvider)); Check.NotNull(name, nameof(name)); - //TODO: Where to set Id? - + Id = id; UserId = userId; LoginProvider = loginProvider; Name = name; diff --git a/src/Volo.Abp.Identity/Volo/Abp/Identity/RoleStore.cs b/src/Volo.Abp.Identity/Volo/Abp/Identity/RoleStore.cs index 196e241ab6..97905b08f5 100644 --- a/src/Volo.Abp.Identity/Volo/Abp/Identity/RoleStore.cs +++ b/src/Volo.Abp.Identity/Volo/Abp/Identity/RoleStore.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using JetBrains.Annotations; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Logging; +using Volo.Abp.Guids; using Volo.Abp.Uow; using Volo.DependencyInjection; @@ -23,19 +24,22 @@ namespace Volo.Abp.Identity private readonly IIdentityRoleRepository _roleRepository; private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly ILogger _logger; + private readonly IGuidGenerator _guidGenerator; /// /// Constructs a new instance of . /// public RoleStore( - IIdentityRoleRepository roleRepository, IUnitOfWorkManager unitOfWorkManager, + IIdentityRoleRepository roleRepository, ILogger logger, + IGuidGenerator guidGenerator, IdentityErrorDescriber describer = null) { - _roleRepository = roleRepository; _unitOfWorkManager = unitOfWorkManager; + _roleRepository = roleRepository; _logger = logger; + _guidGenerator = guidGenerator; ErrorDescriber = describer ?? new IdentityErrorDescriber(); } @@ -281,7 +285,7 @@ namespace Volo.Abp.Identity Check.NotNull(role, nameof(role)); Check.NotNull(claim, nameof(claim)); - role.AddClaim(claim); + role.AddClaim(_guidGenerator, claim); return Task.FromResult(false); } diff --git a/src/Volo.Abp.Identity/Volo/Abp/Identity/UserStore.cs b/src/Volo.Abp.Identity/Volo/Abp/Identity/UserStore.cs index 5bcc50b11d..d5cdb47e35 100644 --- a/src/Volo.Abp.Identity/Volo/Abp/Identity/UserStore.cs +++ b/src/Volo.Abp.Identity/Volo/Abp/Identity/UserStore.cs @@ -8,9 +8,9 @@ using System.Threading.Tasks; using JetBrains.Annotations; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Logging; +using Volo.Abp.Guids; using Volo.Abp.Uow; using Volo.DependencyInjection; -using Volo.ExtensionMethods; namespace Volo.Abp.Identity { @@ -44,6 +44,7 @@ namespace Volo.Abp.Identity public bool AutoSaveChanges { get; set; } = true; private readonly IIdentityRoleRepository _roleRepository; + private readonly IGuidGenerator _guidGenerator; private readonly ILogger _logger; private readonly IIdentityUserRepository _userRepository; private readonly IUnitOfWorkManager _unitOfWorkManager; @@ -52,12 +53,14 @@ namespace Volo.Abp.Identity IUnitOfWorkManager unitOfWorkManager, IIdentityUserRepository userRepository, IIdentityRoleRepository roleRepository, + IGuidGenerator guidGenerator, ILogger logger, IdentityErrorDescriber describer = null) //TODO: describer? TODO: Test if DI supports optional injection { _unitOfWorkManager = unitOfWorkManager; _userRepository = userRepository; _roleRepository = roleRepository; + _guidGenerator = guidGenerator; _logger = logger; ErrorDescriber = describer ?? new IdentityErrorDescriber(); @@ -320,11 +323,7 @@ namespace Volo.Abp.Identity cancellationToken.ThrowIfCancellationRequested(); Check.NotNull(user, nameof(user)); - - if (normalizedRoleName.IsNullOrWhiteSpace()) //TODO: Create a Check.NotNullOrWhiteSpace()? - { - throw new ArgumentException(nameof(normalizedRoleName) + " can not be null or whitespace"); - } + Check.NotNull(normalizedRoleName, nameof(normalizedRoleName)); var role = await _roleRepository.FindByNormalizedNameAsync(normalizedRoleName, cancellationToken); @@ -333,7 +332,7 @@ namespace Volo.Abp.Identity throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, "Role {0} does not exist.", normalizedRoleName)); //TODO: Localize } - user.AddRole(role.Id); + user.AddRole(_guidGenerator, role.Id); } /// @@ -443,7 +442,7 @@ namespace Volo.Abp.Identity Check.NotNull(user, nameof(user)); Check.NotNull(claims, nameof(claims)); - user.AddClaims(claims); + user.AddClaims(_guidGenerator, claims); return Task.CompletedTask; } @@ -502,7 +501,7 @@ namespace Volo.Abp.Identity Check.NotNull(user, nameof(user)); Check.NotNull(login, nameof(login)); - user.AddLogin(login); + user.AddLogin(_guidGenerator, login); return Task.CompletedTask; } @@ -998,7 +997,7 @@ namespace Volo.Abp.Identity Check.NotNull(user, nameof(user)); - user.SetToken(loginProvider, name, value); + user.SetToken(_guidGenerator, loginProvider, name, value); return Task.CompletedTask; } diff --git a/src/Volo.Abp/Volo/Check.cs b/src/Volo.Abp/Volo/Check.cs index f3af3aa6b5..37fa30ea7e 100644 --- a/src/Volo.Abp/Volo/Check.cs +++ b/src/Volo.Abp/Volo/Check.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics; using JetBrains.Annotations; +using Volo.ExtensionMethods; using Volo.ExtensionMethods.Collections.Generic; namespace Volo @@ -20,6 +21,17 @@ namespace Volo return value; } + [ContractAnnotation("value:null => halt")] + public static string NotNullOrWhiteSpace(string value, [InvokerParameterName] [NotNull] string parameterName) + { + if (value.IsNullOrWhiteSpace()) + { + throw new ArgumentException($"{parameterName} can not be null, empty or white space!", parameterName); + } + + return value; + } + [ContractAnnotation("value:null => halt")] public static ICollection NotNullOrEmpty(ICollection value, [InvokerParameterName] [NotNull] string parameterName) {