using System; using System.Collections.Generic; using System.Linq; namespace ln.identities { public abstract class BaseIdentityProvider : IIdentityProvider { public BaseIdentityProvider() { } public virtual Identity Authenticate(AuthenticationProve authenticationProve) { Identity identity = GetIdentity(authenticationProve.IdentityName); if (identity == null) throw new KeyNotFoundException(); SecureAttribute secureAttribute = identity.GetSecureAttribute(authenticationProve.SecureAttributeUniqueID); if (secureAttribute.Authenticate(authenticationProve.Challenge, authenticationProve.Prove)) { return identity; } throw new ArgumentOutOfRangeException(); } public abstract Identity CreateIdentity(string identityName); public abstract IEnumerable> GetIdentities(); public abstract Identity GetIdentity(Guid uniqueID); public abstract bool Save(Identity identity); public virtual Identity GetIdentity(string identityName) => GetIdentity(GetIdentities().FirstOrDefault((kvp) => identityName.Equals(kvp.Value)).Key); public abstract IEnumerable GetRoleAssignments(Identity identity); public virtual AssignedRoles GetAssignedRoles(Identity identity) { AssignedRoles assignedRoles = new AssignedRoles(this); GetAssignedRoles(identity, assignedRoles); return assignedRoles; } public virtual void GetAssignedRoles(Identity identity,AssignedRoles assignedRoles) { assignedRoles[identity].Role |= Role.BE; foreach (RoleAssignment roleAssignment in identity.RoleAssignments) { foreach (AssignedRole foreignRole in roleAssignment.EffectiveIdentity.AssignedRoles) { if (roleAssignment.Role.HasFlag(Role.IMPERSONATE) || foreignRole.Identity.Equals(roleAssignment.EffectiveIdentity)) { AssignedRole currentRole = assignedRoles[foreignRole.Identity]; currentRole.Role |= (foreignRole.Role & roleAssignment.Role); } } } } } }