none
Como Serializar o IdentityUser do ASP.NET Identity? RRS feed

  • Pergunta

  • Olá pessoal, estou implementando o Identity em um sistema aqui que usava autenticação com uma Model de usuário com EF e sendo controlada por Session (sim é um sistema legado em web forms ;/ ), blz implementamos, substituímos a model de usuário pelo ApplicationUser do Identity, tudo funcionando ok.

    O problema é que existe um sistema de notificações, que basicamente é relacionamento N-N entre uma classe de notificação e usuário, essas notificações ficam salvas no sql server junto com o resto do sistema, mas ficam também em um Cache Redis para leitura mais rápida e que precisa ser serializado para escrita, então adicionei um ICollection de ApplicationUser na notificação e vice-versa.

    O problema é que o ApplicationUser herda de IdentityUser, mesmo adicionando a annotation [Serializable] eu recebo a exception:
    "O tipo 'Microsoft.AspNet.Identity.EntityFramework.IdentityUser' no assembly 'Microsoft.AspNet.Identity.EntityFramework, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' não está marcado como serializável"

    Minha dúvida é, existe alguma maneira de serializar isso? ou vou ter que criar uma outra model de usuário só para se relacionar com as notificações?

    Model do ApplicationUser:

    [Serializable]
    public class ApplicationUser : IdentityUser
    {
        public ApplicationUser()
        {
            this.Notificacoes = new List<Notificacao>();
        }
    
        public ClaimsIdentity GenerateUserIdentity(IdentityConfig.ApplicationUserManager manager)
        {
            var userIdentity = manager.CreateIdentity(this, DefaultAuthenticationTypes.ApplicationCookie);
            return userIdentity;
        }
    
        public Task<ClaimsIdentity> GenerateUserIdentityAsync(IdentityConfig.ApplicationUserManager manager)
        {
            return Task.FromResult(GenerateUserIdentity(manager));
        }
        public bool ReceiveNotifications { get; set; }
        public int Permission { get; set; }
        public virtual ICollection<Notificacao> Notificacoes { get; set; }
    }
    Model das notificações:
    [Serializable]
    public partial class Notificacao
    {
        public Notificacao()
        {
            this.Usuarios = new List<ApplicationUser>();
        }
    
        public int Codigo { get; set; }
        public string Mensagem { get; set; }
        public DateTime DataHoraNotificacao { get; set; }
        public int Tipo { get; set; }
        public virtual ICollection<ApplicationUser> Usuarios { get; set; }
    
    }
    Metodo que Serializa um objeto para o Redis (onde ocorre a ex)
    static byte[] Serialize(object o)
    {
        if (o == null)
        {
            return null;
        }
    
        BinaryFormatter binaryFormatter = new BinaryFormatter();
        using (MemoryStream memoryStream = new MemoryStream())
        {
            binaryFormatter.Serialize(memoryStream, o);
            byte[] objectDataAsStream = memoryStream.ToArray();
            return objectDataAsStream;
        }
    }

    Desde já agradeço

    quinta-feira, 17 de setembro de 2015 22:52

Respostas