diff --git a/RavenDB.Identity/IdentityUser.cs b/RavenDB.Identity/IdentityUser.cs index 08ab116..8b6cb07 100644 --- a/RavenDB.Identity/IdentityUser.cs +++ b/RavenDB.Identity/IdentityUser.cs @@ -72,6 +72,11 @@ namespace RavenDB.Identity /// public virtual bool TwoFactorEnabled { get; set; } + /// + /// The two-factor authenticator key. + /// + public string TwoFactorAuthenticatorKey { get; set; } + /// /// The roles of the user. To modify the user's roles, use nad . /// diff --git a/RavenDB.Identity/RavenDB.Identity.csproj b/RavenDB.Identity/RavenDB.Identity.csproj index a061152..058dea8 100644 --- a/RavenDB.Identity/RavenDB.Identity.csproj +++ b/RavenDB.Identity/RavenDB.Identity.csproj @@ -14,11 +14,11 @@ https://github.com/JudahGabriel/RavenDB.Identity https://github.com/JudahGabriel/RavenDB.Identity/blob/master/LICENSE.md https://github.com/JudahGabriel/RavenDB.Identity/blob/master/RavenDB.Identity/nuget-icon.png?raw=true - Copyright 2017 BitShuva + Copyright 2018 BitShuva false false false - 3.0.0 + 3.1.0 False diff --git a/RavenDB.Identity/UserStore.cs b/RavenDB.Identity/UserStore.cs index 8b688ea..e74b28b 100644 --- a/RavenDB.Identity/UserStore.cs +++ b/RavenDB.Identity/UserStore.cs @@ -27,18 +27,27 @@ namespace RavenDB.Identity IUserEmailStore, IUserLockoutStore, IUserTwoFactorStore, - IUserPhoneNumberStore + IUserPhoneNumberStore, + IUserAuthenticatorKeyStore where TUser : IdentityUser { private bool _disposed; private readonly Func getSessionFunc; private IAsyncDocumentSession _session; + /// + /// Creates a new user store that uses the Raven document session returned from the specified session fetcher. + /// + /// The function that gets the Raven document session. public UserStore(Func getSession) { this.getSessionFunc = getSession; } + /// + /// Creates a new user store that uses the specified Raven document session. + /// + /// public UserStore(IAsyncDocumentSession session) { this._session = session; @@ -46,6 +55,9 @@ namespace RavenDB.Identity #region IDispoable implementation + /// + /// Disposes the user store. + /// public void Dispose() { _disposed = true; @@ -55,6 +67,7 @@ namespace RavenDB.Identity #region IUserStore implementation + /// public Task GetUserIdAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -62,6 +75,7 @@ namespace RavenDB.Identity return Task.FromResult(user.Id); } + /// public Task GetUserNameAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -69,6 +83,7 @@ namespace RavenDB.Identity return Task.FromResult(user.UserName); } + /// public Task SetUserNameAsync(TUser user, string userName, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -77,6 +92,7 @@ namespace RavenDB.Identity return Task.CompletedTask; } + /// public Task GetNormalizedUserNameAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -85,6 +101,7 @@ namespace RavenDB.Identity return Task.FromResult(user.UserName); } + /// public Task SetNormalizedUserNameAsync(TUser user, string normalizedName, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -93,6 +110,7 @@ namespace RavenDB.Identity return Task.CompletedTask; } + /// public async Task CreateAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -115,6 +133,7 @@ namespace RavenDB.Identity return IdentityResult.Success; } + /// public Task UpdateAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -122,6 +141,7 @@ namespace RavenDB.Identity return Task.FromResult(IdentityResult.Success); } + /// public async Task DeleteAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -138,6 +158,7 @@ namespace RavenDB.Identity return IdentityResult.Success; } + /// public Task FindByIdAsync(string userId, CancellationToken cancellationToken) { ThrowIfDisposedOrCancelled(cancellationToken); @@ -145,6 +166,7 @@ namespace RavenDB.Identity return DbSession.LoadAsync(userId); } + /// public async Task FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken) { ThrowIfDisposedOrCancelled(cancellationToken); @@ -168,6 +190,7 @@ namespace RavenDB.Identity #region IUserLoginStore implementation + /// public async Task AddLoginAsync(TUser user, UserLoginInfo login, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -191,6 +214,7 @@ namespace RavenDB.Identity } } + /// public async Task RemoveLoginAsync(TUser user, string loginProvider, string providerKey, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -208,6 +232,7 @@ namespace RavenDB.Identity user.Logins.RemoveAll(x => x.LoginProvider == login.LoginProvider && x.ProviderKey == login.ProviderKey); } + /// public Task> GetLoginsAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -215,6 +240,7 @@ namespace RavenDB.Identity return Task.FromResult(user.Logins.ToIList()); } + /// public async Task FindByLoginAsync(string loginProvider, string providerKey, CancellationToken cancellationToken) { var login = new UserLoginInfo(loginProvider, providerKey, string.Empty); @@ -232,6 +258,7 @@ namespace RavenDB.Identity #region IUserClaimStore implementation + /// public Task> GetClaimsAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -242,6 +269,7 @@ namespace RavenDB.Identity return Task.FromResult(result); } + /// public Task AddClaimsAsync(TUser user, IEnumerable claims, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -250,6 +278,7 @@ namespace RavenDB.Identity return Task.CompletedTask; } + /// public async Task ReplaceClaimAsync(TUser user, Claim claim, Claim newClaim, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -262,6 +291,7 @@ namespace RavenDB.Identity } } + /// public Task RemoveClaimsAsync(TUser user, IEnumerable claims, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -270,6 +300,7 @@ namespace RavenDB.Identity return Task.CompletedTask; } + /// public Task> GetUsersForClaimAsync(Claim claim, CancellationToken cancellationToken) { ThrowIfDisposedOrCancelled(cancellationToken); @@ -287,13 +318,7 @@ namespace RavenDB.Identity #region IUserRoleStore implementation - /// - /// Adds the user to the specified role. - /// - /// The user. - /// The name of the role. - /// - /// + /// public async Task AddToRoleAsync(TUser user, string roleName, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -320,13 +345,7 @@ namespace RavenDB.Identity } } - /// - /// Removes the user from the specified role. - /// - /// - /// - /// - /// + /// public async Task RemoveFromRoleAsync(TUser user, string roleName, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -341,6 +360,7 @@ namespace RavenDB.Identity } } + /// public Task> GetRolesAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -348,6 +368,7 @@ namespace RavenDB.Identity return Task.FromResult>(new List(user.Roles)); } + /// public Task IsInRoleAsync(TUser user, string roleName, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(roleName)) @@ -358,6 +379,7 @@ namespace RavenDB.Identity return Task.FromResult(user.Roles.Contains(roleName, StringComparer.OrdinalIgnoreCase)); } + /// public Task> GetUsersInRoleAsync(string roleName, CancellationToken cancellationToken) { ThrowIfDisposedOrCancelled(cancellationToken); @@ -376,6 +398,7 @@ namespace RavenDB.Identity #region IUserPasswordStore implementation + /// public Task SetPasswordHashAsync(TUser user, string passwordHash, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -384,6 +407,7 @@ namespace RavenDB.Identity return Task.CompletedTask; } + /// public Task GetPasswordHashAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -391,6 +415,7 @@ namespace RavenDB.Identity return Task.FromResult(user.PasswordHash); } + /// public Task HasPasswordAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -402,6 +427,7 @@ namespace RavenDB.Identity #region IUserSecurityStampStore implementation + /// public Task SetSecurityStampAsync(TUser user, string stamp, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -410,6 +436,7 @@ namespace RavenDB.Identity return Task.CompletedTask; } + /// public Task GetSecurityStampAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -421,6 +448,7 @@ namespace RavenDB.Identity #region IUserEmailStore implementation + /// public Task SetEmailAsync(TUser user, string email, CancellationToken cancellationToken) { ThrowIfDisposedOrCancelled(cancellationToken); @@ -428,6 +456,7 @@ namespace RavenDB.Identity return Task.CompletedTask; } + /// public Task GetEmailAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -435,6 +464,7 @@ namespace RavenDB.Identity return Task.FromResult(user.Email); } + /// public Task GetEmailConfirmedAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -442,6 +472,7 @@ namespace RavenDB.Identity return Task.FromResult(user.EmailConfirmed); } + /// public Task SetEmailConfirmedAsync(TUser user, bool confirmed, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -450,6 +481,7 @@ namespace RavenDB.Identity return Task.CompletedTask; } + /// public Task FindByEmailAsync(string normalizedEmail, CancellationToken cancellationToken) { ThrowIfDisposedOrCancelled(cancellationToken); @@ -458,6 +490,7 @@ namespace RavenDB.Identity .FirstOrDefaultAsync(u => u.Email == normalizedEmail, cancellationToken); } + /// public Task GetNormalizedEmailAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -466,6 +499,7 @@ namespace RavenDB.Identity return Task.FromResult(user.Email); } + /// public Task SetNormalizedEmailAsync(TUser user, string normalizedEmail, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -482,6 +516,7 @@ namespace RavenDB.Identity #region IUserLockoutStore implementation + /// public Task GetLockoutEndDateAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -489,6 +524,7 @@ namespace RavenDB.Identity return Task.FromResult(user.LockoutEndDate); } + /// public Task SetLockoutEndDateAsync(TUser user, DateTimeOffset? lockoutEnd, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -497,6 +533,7 @@ namespace RavenDB.Identity return Task.CompletedTask; } + /// public Task IncrementAccessFailedCountAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -505,6 +542,7 @@ namespace RavenDB.Identity return Task.FromResult(user.AccessFailedCount); } + /// public Task ResetAccessFailedCountAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -513,6 +551,7 @@ namespace RavenDB.Identity return Task.CompletedTask; } + /// public Task GetAccessFailedCountAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -520,12 +559,14 @@ namespace RavenDB.Identity return Task.FromResult(user.AccessFailedCount); } + /// public Task GetLockoutEnabledAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); return Task.FromResult(user.LockoutEnabled); } + /// public Task SetLockoutEnabledAsync(TUser user, bool enabled, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -538,6 +579,7 @@ namespace RavenDB.Identity #region IUserTwoFactorStore implementation + /// public Task SetTwoFactorEnabledAsync(TUser user, bool enabled, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -546,6 +588,7 @@ namespace RavenDB.Identity return Task.CompletedTask; } + /// public Task GetTwoFactorEnabledAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -557,6 +600,7 @@ namespace RavenDB.Identity #region IUserPhoneNumberStore implementation + /// public Task SetPhoneNumberAsync(TUser user, string phoneNumber, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -565,6 +609,7 @@ namespace RavenDB.Identity return Task.CompletedTask; } + /// public Task GetPhoneNumberAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -572,6 +617,7 @@ namespace RavenDB.Identity return Task.FromResult(user.PhoneNumber); } + /// public Task GetPhoneNumberConfirmedAsync(TUser user, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -579,6 +625,7 @@ namespace RavenDB.Identity return Task.FromResult(user.IsPhoneNumberConfirmed); } + /// public Task SetPhoneNumberConfirmedAsync(TUser user, bool confirmed, CancellationToken cancellationToken) { ThrowIfNullDisposedCancelled(user, cancellationToken); @@ -589,6 +636,23 @@ namespace RavenDB.Identity #endregion + #region IUserAuthenticatorKeyStore implementation + + /// + public Task SetAuthenticatorKeyAsync(TUser user, string key, CancellationToken cancellationToken) + { + user.TwoFactorAuthenticatorKey = key; + return Task.CompletedTask; + } + + /// + public Task GetAuthenticatorKeyAsync(TUser user, CancellationToken cancellationToken) + { + return Task.FromResult(user.TwoFactorAuthenticatorKey); + } + + #endregion + private IAsyncDocumentSession DbSession { get @@ -623,6 +687,5 @@ namespace RavenDB.Identity } token.ThrowIfCancellationRequested(); } - } }