ln.identities/BaseIdentityProvider.cs

74 lines
2.3 KiB
C#

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<KeyValuePair<Guid, string>> 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<RoleAssignment> 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);
}
}
}
}
}
}