// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity.Test; namespace Microsoft.AspNetCore.Identity.InMemory { public class InMemoryStore : InMemoryUserStore, IUserRoleStore, IQueryableRoleStore, IRoleClaimStore where TRole : PocoRole where TUser : PocoUser { // RoleId == roleName for InMemory public Task AddToRoleAsync(TUser user, string role, CancellationToken cancellationToken = default(CancellationToken)) { var roleEntity = _roles.Values.SingleOrDefault(r => r.NormalizedName == role); if (roleEntity != null) { user.Roles.Add(new PocoUserRole { RoleId = roleEntity.Id, UserId = user.Id }); } return Task.FromResult(0); } // RoleId == roleName for InMemory public Task RemoveFromRoleAsync(TUser user, string role, CancellationToken cancellationToken = default(CancellationToken)) { var roleObject = _roles.Values.SingleOrDefault(r => r.NormalizedName == role); var roleEntity = user.Roles.SingleOrDefault(ur => ur.RoleId == roleObject.Id); if (roleEntity != null) { user.Roles.Remove(roleEntity); } return Task.FromResult(0); } public Task> GetRolesAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken)) { IList roles = new List(); foreach (var r in user.Roles.Select(ur => ur.RoleId)) { roles.Add(_roles[r].Name); } return Task.FromResult(roles); } public Task IsInRoleAsync(TUser user, string role, CancellationToken cancellationToken = default(CancellationToken)) { var roleObject = _roles.Values.SingleOrDefault(r => r.NormalizedName == role); bool result = roleObject != null && user.Roles.Any(ur => ur.RoleId == roleObject.Id); return Task.FromResult(result); } // RoleId == rolename for inmemory store tests public Task> GetUsersInRoleAsync(string roleName, CancellationToken cancellationToken = default(CancellationToken)) { if (String.IsNullOrEmpty(roleName)) { throw new ArgumentNullException(nameof(roleName)); } var role = _roles.Values.Where(x => x.NormalizedName.Equals(roleName)).SingleOrDefault(); if (role == null) { return Task.FromResult>(new List()); } return Task.FromResult>(Users.Where(u => (u.Roles.Where(x => x.RoleId == role.Id).Count() > 0)).Select(x => x).ToList()); } private readonly Dictionary _roles = new Dictionary(); public Task CreateAsync(TRole role, CancellationToken cancellationToken = default(CancellationToken)) { _roles[role.Id] = role; return Task.FromResult(IdentityResult.Success); } public Task DeleteAsync(TRole role, CancellationToken cancellationToken = default(CancellationToken)) { if (role == null || !_roles.ContainsKey(role.Id)) { throw new InvalidOperationException("Unknown role"); } _roles.Remove(role.Id); return Task.FromResult(IdentityResult.Success); } public Task GetRoleIdAsync(TRole role, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(role.Id); } public Task GetRoleNameAsync(TRole role, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(role.Name); } public Task SetRoleNameAsync(TRole role, string roleName, CancellationToken cancellationToken = default(CancellationToken)) { role.Name = roleName; return Task.FromResult(0); } public Task UpdateAsync(TRole role, CancellationToken cancellationToken = default(CancellationToken)) { _roles[role.Id] = role; return Task.FromResult(IdentityResult.Success); } Task IRoleStore.FindByIdAsync(string roleId, CancellationToken cancellationToken) { if (_roles.ContainsKey(roleId)) { return Task.FromResult(_roles[roleId]); } return Task.FromResult(null); } Task IRoleStore.FindByNameAsync(string roleName, CancellationToken cancellationToken) { return Task.FromResult( Roles.SingleOrDefault(r => String.Equals(r.NormalizedName, roleName, StringComparison.OrdinalIgnoreCase))); } public Task> GetClaimsAsync(TRole role, CancellationToken cancellationToken = default(CancellationToken)) { var claims = role.Claims.Select(c => new Claim(c.ClaimType, c.ClaimValue)).ToList(); return Task.FromResult>(claims); } public Task AddClaimAsync(TRole role, Claim claim, CancellationToken cancellationToken = default(CancellationToken)) { role.Claims.Add(new PocoRoleClaim { ClaimType = claim.Type, ClaimValue = claim.Value, RoleId = role.Id }); return Task.FromResult(0); } public Task RemoveClaimAsync(TRole role, Claim claim, CancellationToken cancellationToken = default(CancellationToken)) { var entity = role.Claims.FirstOrDefault( ur => ur.RoleId == role.Id && ur.ClaimType == claim.Type && ur.ClaimValue == claim.Value); if (entity != null) { role.Claims.Remove(entity); } return Task.FromResult(0); } public Task GetNormalizedRoleNameAsync(TRole role, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(role.NormalizedName); } public Task SetNormalizedRoleNameAsync(TRole role, string normalizedName, CancellationToken cancellationToken = default(CancellationToken)) { role.NormalizedName = normalizedName; return Task.FromResult(0); } public IQueryable Roles { get { return _roles.Values.AsQueryable(); } } } }