IdentityManager / IdentityManager.AspNetIdentity

ASP.NET Identity support for Thinktecture IdentityManager
Apache License 2.0
60 stars 51 forks source link

Can I expose the status of the EmailConfirmed Field #24

Closed sudsy closed 8 years ago

sudsy commented 8 years ago

Hi There,

It seems like I might be able to expose the EmailConfirmed Field with a tweak to metadata, but I can't seem to see how.

Are there any examples / guides that relate?

Regards,

Ben

sudsy commented 8 years ago

I found a way to do this after digging through the source. My code is included below.

public static class SimpleIdentityManagerServiceExtensions
    {
        public static void ConfigureSimpleIdentityManagerService(this IdentityManagerServiceFactory factory, string connectionString)
        {
            factory.Register(new Registration<Context>(resolver => new Context(connectionString)));
            factory.Register(new Registration<UserStore>());
            factory.Register(new Registration<RoleStore>());
            factory.Register(new Registration<UserManager>());
            factory.Register(new Registration<RoleManager>());
            factory.IdentityManagerService = new Registration<IIdentityManagerService, SimpleIdentityManagerService>();
        }
    }

    public class SimpleIdentityManagerService : AspNetIdentityManagerService<User, string, Role, string>
    {
        public SimpleIdentityManagerService(UserManager userMgr, RoleManager roleMgr)
            : base(userMgr, roleMgr)
        {

        }
        public override Task<IdentityManagerMetadata> GetMetadataAsync()
        {
            return base.GetMetadataAsync().ContinueWith((metadataTask) =>
            {
                var metaData = metadataTask.Result;

                var updateProperties = metaData.UserMetadata.UpdateProperties;
                var newUpdateProperties = new List<PropertyMetadata>();
                newUpdateProperties.Add(PropertyMetadata.FromFunctions<User, bool>("email_confirmed", GetConfirmed, SetConfirmed, name: "Confirmed", dataType: PropertyDataType.Boolean));
                var combinedUpdateProperties = updateProperties.Concat(newUpdateProperties);
                metaData.UserMetadata.UpdateProperties = combinedUpdateProperties;
                return metaData;
            });

        }

        public virtual bool GetConfirmed(User user)
        {
            return userManager.IsEmailConfirmed(user.Id);
        }
        public virtual IdentityManagerResult SetConfirmed(User user, bool value)
        {
            throw new Exception("Cannot set confirmed value");
        }
    }