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();
}
-
}
}