@ -13,29 +13,96 @@ using System.Threading;
using System.Threading.Tasks ;
using Microsoft.AspNetCore.Identity ;
using MongoDB.Bson ;
using MongoDB.Bson.Serialization ;
using MongoDB.Bson.Serialization.Serializers ;
using MongoDB.Driver ;
using Squidex.Infrastructure.MongoDb ;
using Squidex.Infrastructure.Tasks ;
using Squidex.Shared.Users ;
namespace Squidex.Domain.Users.MongoDb
{
public sealed class MongoUserStore :
MongoRepositoryBase < MongoUser > ,
IUserPasswordStore < IUser > ,
IUserRoleStore < IUser > ,
IUserLoginStore < IUser > ,
IUserSecurityStampStore < IUser > ,
IUserEmailStore < IUser > ,
IUserClaimStore < IUser > ,
IUserPhoneNumberStore < IUser > ,
IUserTwoFactorStore < IUser > ,
IUserLockoutStore < IUser > ,
IUserAuthenticationTokenStore < IUser > ,
IUserAuthenticationTokenStore < IdentityUser > ,
IUserAuthenticatorKeyStore < IdentityUser > ,
IUserClaimStore < IdentityUser > ,
IUserEmailStore < IdentityUser > ,
IUserFactory ,
IUserResolver ,
IQueryableUserStore < IUser >
IUserLockoutStore < IdentityUser > ,
IUserLoginStore < IdentityUser > ,
IUserPasswordStore < IdentityUser > ,
IUserPhoneNumberStore < IdentityUser > ,
IUserSecurityStampStore < IdentityUser > ,
IUserTwoFactorStore < IdentityUser > ,
IUserTwoFactorRecoveryCodeStore < IdentityUser > ,
IQueryableUserStore < IdentityUser >
{
private const string InternalLoginProvider = "[AspNetUserStore]" ;
private const string AuthenticatorKeyTokenName = "AuthenticatorKey" ;
private const string RecoveryCodeTokenName = "RecoveryCodes" ;
static MongoUserStore ( )
{
BsonClassMap . RegisterClassMap < Claim > ( cm = >
{
cm . MapConstructor ( typeof ( Claim ) . GetConstructors ( )
. First ( x = >
{
var parameters = x . GetParameters ( ) ;
return parameters . Length = = 2 & &
parameters [ 0 ] . Name = = "type" & &
parameters [ 0 ] . ParameterType = = typeof ( string ) & &
parameters [ 1 ] . Name = = "value" & &
parameters [ 1 ] . ParameterType = = typeof ( string ) ;
} ) )
. SetArguments ( new [ ]
{
nameof ( Claim . Type ) ,
nameof ( Claim . Value )
} ) ;
cm . MapMember ( x = > x . Type ) ;
cm . MapMember ( x = > x . Value ) ;
} ) ;
BsonClassMap . RegisterClassMap < UserLoginInfo > ( cm = >
{
cm . MapConstructor ( typeof ( UserLoginInfo ) . GetConstructors ( ) . First ( ) )
. SetArguments ( new [ ]
{
nameof ( UserLoginInfo . LoginProvider ) ,
nameof ( UserLoginInfo . ProviderKey ) ,
nameof ( UserLoginInfo . ProviderDisplayName )
} ) ;
cm . AutoMap ( ) ;
} ) ;
BsonClassMap . RegisterClassMap < IdentityUserToken < string > > ( cm = >
{
cm . AutoMap ( ) ;
cm . UnmapMember ( x = > x . UserId ) ;
} ) ;
BsonClassMap . RegisterClassMap < IdentityUser < string > > ( cm = >
{
cm . AutoMap ( ) ;
cm . MapMember ( x = > x . Id ) . SetSerializer ( new StringSerializer ( BsonType . ObjectId ) ) ;
cm . MapMember ( x = > x . AccessFailedCount ) . SetIgnoreIfDefault ( true ) ;
cm . MapMember ( x = > x . EmailConfirmed ) . SetIgnoreIfDefault ( true ) ;
cm . MapMember ( x = > x . LockoutEnd ) . SetElementName ( "LockoutEndDateUtc" ) . SetIgnoreIfNull ( true ) ;
cm . MapMember ( x = > x . LockoutEnabled ) . SetIgnoreIfDefault ( true ) ;
cm . MapMember ( x = > x . PasswordHash ) . SetIgnoreIfNull ( true ) ;
cm . MapMember ( x = > x . PhoneNumber ) . SetIgnoreIfNull ( true ) ;
cm . MapMember ( x = > x . PhoneNumberConfirmed ) . SetIgnoreIfDefault ( true ) ;
cm . MapMember ( x = > x . SecurityStamp ) . SetIgnoreIfNull ( true ) ;
cm . MapMember ( x = > x . TwoFactorEnabled ) . SetIgnoreIfDefault ( true ) ;
} ) ;
}
public MongoUserStore ( IMongoDatabase database )
: base ( database )
{
@ -66,352 +133,374 @@ namespace Squidex.Domain.Users.MongoDb
{
}
public IQueryable < IUser > Users
public IQueryable < Identity User > Users
{
get { return Collection . AsQueryable ( ) ; }
}
public IUser Create ( string email )
public bool IsId ( string id )
{
return ObjectId . TryParse ( id , out var _ ) ;
}
public IdentityUser Create ( string email )
{
return new MongoUser { Email = email , UserName = email } ;
}
public async Task < IUser > FindByIdAsync ( string userId , CancellationToken cancellationToken )
public async Task < Identity User > FindByIdAsync ( string userId , CancellationToken cancellationToken )
{
return await Collection . Find ( x = > x . Id = = userId ) . FirstOrDefaultAsync ( cancellationToken ) ;
}
public async Task < IUser > FindByEmailAsync ( string normalizedEmail , CancellationToken cancellationToken )
public async Task < Identity User > FindByEmailAsync ( string normalizedEmail , CancellationToken cancellationToken )
{
return await Collection . Find ( x = > x . NormalizedEmail = = normalizedEmail ) . FirstOrDefaultAsync ( cancellationToken ) ;
}
public async Task < IUser > FindByNameAsync ( string normalizedUserName , CancellationToken cancellationToken )
public async Task < Identity User > FindByNameAsync ( string normalizedUserName , CancellationToken cancellationToken )
{
return await Collection . Find ( x = > x . NormalizedEmail = = normalizedUserName ) . FirstOrDefaultAsync ( cancellationToken ) ;
}
public async Task < IUser > FindByLoginAsync ( string loginProvider , string providerKey , CancellationToken cancellationToken )
public async Task < Identity User > FindByLoginAsync ( string loginProvider , string providerKey , CancellationToken cancellationToken )
{
return await Collection . Find ( x = > x . Logins . Any ( y = > y . LoginProvider = = loginProvider & & y . ProviderKey = = providerKey ) ) . FirstOrDefaultAsync ( cancellationToken ) ;
}
public async Task < IList < IUser > > GetUsersForClaimAsync ( Claim claim , CancellationToken cancellationToken )
public async Task < IList < Identity User > > GetUsersForClaimAsync ( Claim claim , CancellationToken cancellationToken )
{
return ( await Collection . Find ( x = > x . Claims . Any ( y = > y . Type = = claim . Type & & y . Value = = claim . Value ) ) . ToListAsync ( cancellationToken ) ) . OfType < IUser > ( ) . ToList ( ) ;
return ( await Collection . Find ( x = > x . Claims . Any ( y = > y . Type = = claim . Type & & y . Value = = claim . Value ) ) . ToListAsync ( cancellationToken ) ) . OfType < Identity User > ( ) . ToList ( ) ;
}
public async Task < IList < IUser > > GetUsersInRoleAsync ( string roleName , CancellationToken cancellationToken )
public async Task < IList < Identity User > > GetUsersInRoleAsync ( string roleName , CancellationToken cancellationToken )
{
return ( await Collection . Find ( x = > x . Roles . Contains ( roleName ) ) . ToListAsync ( cancellationToken ) ) . OfType < IUser > ( ) . ToList ( ) ;
return ( await Collection . Find ( x = > x . Roles . Contains ( roleName ) ) . ToListAsync ( cancellationToken ) ) . OfType < Identity User > ( ) . ToList ( ) ;
}
public async Task < IdentityResult > CreateAsync ( IUser user , CancellationToken cancellationToken )
public async Task < IdentityResult > CreateAsync ( Identity User user , CancellationToken cancellationToken )
{
user . Id = ObjectId . GenerateNewId ( ) . ToString ( ) ;
await Collection . InsertOneAsync ( ( MongoUser ) user , null , cancellationToken ) ;
return IdentityResult . Success ;
}
public async Task < IdentityResult > UpdateAsync ( IUser user , CancellationToken cancellationToken )
public async Task < IdentityResult > UpdateAsync ( Identity User user , CancellationToken cancellationToken )
{
await Collection . ReplaceOneAsync ( x = > x . Id = = user . Id , ( MongoUser ) user , null , cancellationToken ) ;
return IdentityResult . Success ;
}
public async Task < IdentityResult > DeleteAsync ( IUser user , CancellationToken cancellationToken )
public async Task < IdentityResult > DeleteAsync ( Identity User user , CancellationToken cancellationToken )
{
await Collection . DeleteOneAsync ( x = > x . Id = = user . Id , null , cancellationToken ) ;
return IdentityResult . Success ;
}
public Task < string > GetUserIdAsync ( IUser user , CancellationToken cancellationToken )
public Task < string > GetUserIdAsync ( Identity User user , CancellationToken cancellationToken )
{
return Task . FromResult ( ( ( MongoUser ) user ) . Id ) ;
}
public Task < string > GetUserNameAsync ( IUser user , CancellationToken cancellationToken )
public Task < string > GetUserNameAsync ( Identity User user , CancellationToken cancellationToken )
{
return Task . FromResult ( ( ( MongoUser ) user ) . UserName ) ;
}
public Task < string > GetNormalizedUserNameAsync ( IUser user , CancellationToken cancellationToken )
public Task < string > GetNormalizedUserNameAsync ( Identity User user , CancellationToken cancellationToken )
{
return Task . FromResult ( ( ( MongoUser ) user ) . NormalizedUserName ) ;
}
public Task < string > GetPasswordHashAsync ( IUser user , CancellationToken cancellationToken )
public Task < string > GetPasswordHashAsync ( Identity User user , CancellationToken cancellationToken )
{
return Task . FromResult ( ( ( MongoUser ) user ) . PasswordHash ) ;
}
public Task < IList < string > > GetRolesAsync ( IUser user , CancellationToken cancellationToken )
public Task < IList < string > > GetRolesAsync ( Identity User user , CancellationToken cancellationToken )
{
return Task . FromResult < IList < string > > ( ( ( MongoUser ) user ) . Roles ) ;
return Task . FromResult < IList < string > > ( ( ( MongoUser ) user ) . Roles . ToList ( ) ) ;
}
public Task < bool > IsInRoleAsync ( IUser user , string roleName , CancellationToken cancellationToken )
public Task < bool > IsInRoleAsync ( Identity User user , string roleName , CancellationToken cancellationToken )
{
return Task . FromResult ( ( ( MongoUser ) user ) . Roles . Contains ( roleName ) ) ;
}
public Task < IList < UserLoginInfo > > GetLoginsAsync ( IUser user , CancellationToken cancellationToken )
public Task < IList < UserLoginInfo > > GetLoginsAsync ( Identity User user , CancellationToken cancellationToken )
{
return Task . FromResult < IList < UserLoginInfo > > ( ( ( MongoUser ) user ) . Logins . Select ( x = > ( UserLoginInfo ) x ) . ToList ( ) ) ;
return Task . FromResult < IList < UserLoginInfo > > ( ( ( MongoUser ) user ) . Logins . Select ( x = > new UserLoginInfo ( x . LoginProvider , x . ProviderKey , x . ProviderDisplayName ) ) . ToList ( ) ) ;
}
public Task < string > GetSecurityStampAsync ( IUser user , CancellationToken cancellationToken )
public Task < string > GetSecurityStampAsync ( Identity User user , CancellationToken cancellationToken )
{
return Task . FromResult ( ( ( MongoUser ) user ) . SecurityStamp ) ;
}
public Task < string > GetEmailAsync ( IUser user , CancellationToken cancellationToken )
public Task < string > GetEmailAsync ( Identity User user , CancellationToken cancellationToken )
{
return Task . FromResult ( ( ( MongoUser ) user ) . Email ) ;
}
public Task < bool > GetEmailConfirmedAsync ( IUser user , CancellationToken cancellationToken )
public Task < bool > GetEmailConfirmedAsync ( Identity User user , CancellationToken cancellationToken )
{
return Task . FromResult ( ( ( MongoUser ) user ) . EmailConfirmed ) ;
}
public Task < string > GetNormalizedEmailAsync ( IUser user , CancellationToken cancellationToken )
public Task < string > GetNormalizedEmailAsync ( Identity User user , CancellationToken cancellationToken )
{
return Task . FromResult ( ( ( MongoUser ) user ) . NormalizedEmail ) ;
}
public Task < IList < Claim > > GetClaimsAsync ( IUser user , CancellationToken cancellationToken )
public Task < IList < Claim > > GetClaimsAsync ( Identity User user , CancellationToken cancellationToken )
{
return Task . FromResult < IList < Claim > > ( ( ( MongoUser ) user ) . Claims . Select ( x = > ( Claim ) x ) . ToList ( ) ) ;
return Task . FromResult < IList < Claim > > ( ( ( MongoUser ) user ) . Claims ) ;
}
public Task < string > GetPhoneNumberAsync ( IUser user , CancellationToken cancellationToken )
public Task < string > GetPhoneNumberAsync ( Identity User user , CancellationToken cancellationToken )
{
return Task . FromResult ( ( ( MongoUser ) user ) . PhoneNumber ) ;
}
public Task < bool > GetPhoneNumberConfirmedAsync ( IUser user , CancellationToken cancellationToken )
public Task < bool > GetPhoneNumberConfirmedAsync ( Identity User user , CancellationToken cancellationToken )
{
return Task . FromResult ( ( ( MongoUser ) user ) . PhoneNumberConfirmed ) ;
}
public Task < bool > GetTwoFactorEnabledAsync ( IUser user , CancellationToken cancellationToken )
public Task < bool > GetTwoFactorEnabledAsync ( Identity User user , CancellationToken cancellationToken )
{
return Task . FromResult ( ( ( MongoUser ) user ) . TwoFactorEnabled ) ;
}
public Task < DateTimeOffset ? > GetLockoutEndDateAsync ( IUser user , CancellationToken cancellationToken )
public Task < DateTimeOffset ? > GetLockoutEndDateAsync ( Identity User user , CancellationToken cancellationToken )
{
return Task . FromResult < DateTimeOffset ? > ( ( ( MongoUser ) user ) . LockoutEndDateUtc ) ;
return Task . FromResult < DateTimeOffset ? > ( ( ( MongoUser ) user ) . LockoutEnd ) ;
}
public Task < int > GetAccessFailedCountAsync ( IUser user , CancellationToken cancellationToken )
public Task < int > GetAccessFailedCountAsync ( Identity User user , CancellationToken cancellationToken )
{
return Task . FromResult ( ( ( MongoUser ) user ) . AccessFailedCount ) ;
}
public Task < bool > GetLockoutEnabledAsync ( IUser user , CancellationToken cancellationToken )
public Task < bool > GetLockoutEnabledAsync ( Identity User user , CancellationToken cancellationToken )
{
return Task . FromResult ( ( ( MongoUser ) user ) . LockoutEnabled ) ;
}
public Task < string > GetTokenAsync ( IUser user , string loginProvider , string name , CancellationToken cancellationToken )
public Task < string > GetTokenAsync ( Identity User user , string loginProvider , string name , CancellationToken cancellationToken )
{
return Task . FromResult ( ( ( MongoUser ) user ) . GetToken ( loginProvider , name ) ) ;
}
public Task < bool > HasPasswordAsync ( IUser user , CancellationToken cancellationToken )
public Task < string > GetAuthenticatorKeyAsync ( IdentityUser user , CancellationToken cancellationToken )
{
return Task . FromResult ( ( ( MongoUser ) user ) . GetToken ( InternalLoginProvider , AuthenticatorKeyTokenName ) ) ;
}
public Task < bool > HasPasswordAsync ( IdentityUser user , CancellationToken cancellationToken )
{
return Task . FromResult ( ! string . IsNullOrWhiteSpace ( ( ( MongoUser ) user ) . PasswordHash ) ) ;
}
public Task SetUserNameAsync ( IUser user , string userName , CancellationToken cancellationToken )
public Task < int > CountCodesAsync ( IdentityUser user , CancellationToken cancellationToken )
{
return Task . FromResult ( ( ( MongoUser ) user ) . GetToken ( InternalLoginProvider , RecoveryCodeTokenName ) ? . Split ( ';' ) ? . Length ? ? 0 ) ;
}
public Task SetUserNameAsync ( IdentityUser user , string userName , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . UserName = userName ;
return TaskHelper . Done ;
}
public Task SetNormalizedUserNameAsync ( IUser user , string normalizedName , CancellationToken cancellationToken )
public Task SetNormalizedUserNameAsync ( Identity User user , string normalizedName , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . NormalizedUserName = normalizedName ;
return TaskHelper . Done ;
}
public Task SetPasswordHashAsync ( IUser user , string passwordHash , CancellationToken cancellationToken )
public Task SetPasswordHashAsync ( Identity User user , string passwordHash , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . PasswordHash = passwordHash ;
return TaskHelper . Done ;
}
public Task AddToRoleAsync ( IUser user , string roleName , CancellationToken cancellationToken )
public Task AddToRoleAsync ( Identity User user , string roleName , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . AddRole ( roleName ) ;
return TaskHelper . Done ;
}
public Task RemoveFromRoleAsync ( IUser user , string roleName , CancellationToken cancellationToken )
public Task RemoveFromRoleAsync ( Identity User user , string roleName , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . RemoveRole ( roleName ) ;
return TaskHelper . Done ;
}
public Task AddLoginAsync ( IUser user , UserLoginInfo login , CancellationToken cancellationToken )
public Task AddLoginAsync ( Identity User user , UserLoginInfo login , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . AddLogin ( login ) ;
return TaskHelper . Done ;
}
public Task RemoveLoginAsync ( IUser user , string loginProvider , string providerKey , CancellationToken cancellationToken )
public Task RemoveLoginAsync ( Identity User user , string loginProvider , string providerKey , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . RemoveLogin ( loginProvider , providerKey ) ;
return TaskHelper . Done ;
}
public Task SetSecurityStampAsync ( IUser user , string stamp , CancellationToken cancellationToken )
public Task SetSecurityStampAsync ( Identity User user , string stamp , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . SecurityStamp = stamp ;
return TaskHelper . Done ;
}
public Task SetEmailAsync ( IUser user , string email , CancellationToken cancellationToken )
public Task SetEmailAsync ( Identity User user , string email , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . Email = email ;
return TaskHelper . Done ;
}
public Task SetEmailConfirmedAsync ( IUser user , bool confirmed , CancellationToken cancellationToken )
public Task SetEmailConfirmedAsync ( Identity User user , bool confirmed , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . EmailConfirmed = confirmed ;
return TaskHelper . Done ;
}
public Task SetNormalizedEmailAsync ( IUser user , string normalizedEmail , CancellationToken cancellationToken )
public Task SetNormalizedEmailAsync ( Identity User user , string normalizedEmail , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . NormalizedEmail = normalizedEmail ;
return TaskHelper . Done ;
}
public Task AddClaimsAsync ( IUser user , IEnumerable < Claim > claims , CancellationToken cancellationToken )
public Task AddClaimsAsync ( Identity User user , IEnumerable < Claim > claims , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . AddClaims ( claims ) ;
return TaskHelper . Done ;
}
public Task ReplaceClaimAsync ( IUser user , Claim claim , Claim newClaim , CancellationToken cancellationToken )
public Task ReplaceClaimAsync ( Identity User user , Claim claim , Claim newClaim , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . ReplaceClaim ( claim , newClaim ) ;
return TaskHelper . Done ;
}
public Task RemoveClaimsAsync ( IUser user , IEnumerable < Claim > claims , CancellationToken cancellationToken )
public Task RemoveClaimsAsync ( Identity User user , IEnumerable < Claim > claims , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . RemoveClaims ( claims ) ;
return TaskHelper . Done ;
}
public Task SetPhoneNumberAsync ( IUser user , string phoneNumber , CancellationToken cancellationToken )
public Task SetPhoneNumberAsync ( Identity User user , string phoneNumber , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . PhoneNumber = phoneNumber ;
return TaskHelper . Done ;
}
public Task SetPhoneNumberConfirmedAsync ( IUser user , bool confirmed , CancellationToken cancellationToken )
public Task SetPhoneNumberConfirmedAsync ( Identity User user , bool confirmed , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . PhoneNumberConfirmed = confirmed ;
return TaskHelper . Done ;
}
public Task SetTwoFactorEnabledAsync ( IUser user , bool enabled , CancellationToken cancellationToken )
public Task SetTwoFactorEnabledAsync ( Identity User user , bool enabled , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . TwoFactorEnabled = enabled ;
return TaskHelper . Done ;
}
public Task SetLockoutEndDateAsync ( IUser user , DateTimeOffset ? lockoutEnd , CancellationToken cancellationToken )
public Task SetLockoutEndDateAsync ( Identity User user , DateTimeOffset ? lockoutEnd , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . LockoutEndDateUtc = lockoutEnd ? . UtcDateTime ;
( ( MongoUser ) user ) . LockoutEnd = lockoutEnd ? . UtcDateTime ;
return TaskHelper . Done ;
}
public Task < int > IncrementAccessFailedCountAsync ( IUser user , CancellationToken cancellationToken )
public Task < int > IncrementAccessFailedCountAsync ( Identity User user , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . AccessFailedCount + + ;
return Task . FromResult ( ( ( MongoUser ) user ) . AccessFailedCount ) ;
}
public Task ResetAccessFailedCountAsync ( IUser user , CancellationToken cancellationToken )
public Task ResetAccessFailedCountAsync ( Identity User user , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . AccessFailedCount = 0 ;
return TaskHelper . Done ;
}
public Task SetLockoutEnabledAsync ( IUser user , bool enabled , CancellationToken cancellationToken )
public Task SetLockoutEnabledAsync ( Identity User user , bool enabled , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . LockoutEnabled = enabled ;
return TaskHelper . Done ;
}
public Task SetTokenAsync ( IUser user , string loginProvider , string name , string value , CancellationToken cancellationToken )
public Task SetTokenAsync ( Identity User user , string loginProvider , string name , string value , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . SetToken ( loginProvider , name , value ) ;
return TaskHelper . Done ;
}
public Task RemoveTokenAsync ( IUser user , string loginProvider , string name , CancellationToken cancellationToken )
public Task RemoveTokenAsync ( Identity User user , string loginProvider , string name , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . RemoveToken ( loginProvider , name ) ;
return TaskHelper . Done ;
}
public async Task < IUser > FindByIdOrEmailAsync ( string id )
public Task SetAuthenticatorKeyAsync ( IdentityUser user , string key , CancellationToken cancellationToken )
{
if ( ObjectId . TryParse ( id , out _ ) )
{
return await Collection . Find ( x = > x . Id = = id ) . FirstOrDefaultAsync ( ) ;
}
else
{
return await Collection . Find ( x = > x . NormalizedEmail = = id . ToUpperInvariant ( ) ) . FirstOrDefaultAsync ( ) ;
}
( ( MongoUser ) user ) . SetToken ( InternalLoginProvider , AuthenticatorKeyTokenName , key ) ;
return TaskHelper . Done ;
}
public Task ReplaceCodesAsync ( IdentityUser user , IEnumerable < string > recoveryCodes , CancellationToken cancellationToken )
{
( ( MongoUser ) user ) . SetToken ( InternalLoginProvider , RecoveryCodeTokenName , string . Join ( ";" , recoveryCodes ) ) ;
return TaskHelper . Done ;
}
public Task < List < IUser > > QueryByEmailAsync ( string email )
public Task < bool > RedeemCodeAsync ( IdentityUser user , string code , CancellationToken cancellationToken )
{
var result = Users ;
var mergedCodes = ( ( MongoUser ) user ) . GetToken ( InternalLoginProvider , RecoveryCodeTokenName ) ? ? string . Empty ;
if ( ! string . IsNullOrWhiteSpace ( email ) )
var splitCodes = mergedCodes . Split ( ';' ) ;
if ( splitCodes . Contains ( code ) )
{
var normalizedEmail = email . ToUpperInvariant ( ) ;
var updatedCodes = new List < string > ( splitCodes . Where ( s = > s ! = code ) ) ;
( ( MongoUser ) user ) . SetToken ( InternalLoginProvider , RecoveryCodeTokenName , string . Join ( ";" , updatedCodes ) ) ;
result = result . Where ( x = > x . NormalizedEmail . Contains ( normalizedEmail ) ) ;
return TaskHelper . True ;
}
return Task . FromResult ( result . Select ( x = > x ) . ToList ( ) ) ;
return TaskHelper . False ;
}
}
}
}