Pregunta

Tengo una aplicación básica MVC 2 beta donde yo estoy tratando de implementar una identidad personalizada y clases principales.

He creado mis clases que implementan las interfaces IIdentity y IPrincipal, ellos instancia y luego asignado el objeto CustomPrincipal a mi Context.User en Application_AuthenticateRequest del Global.asax.

Todo esto tiene éxito y los objetos se ven bien. Cuando comienzo a hacer que las Vistas las páginas están fallando. El primero es el fracaso en la vista LogoOnUserControl predeterminada en la siguiente línea de código:

 [ <%= Html.ActionLink("Log Off", "LogOff", "Account") %> ]

Si me tire de esto, entonces falla en una línea diferente "Html.ActionLink" de código.

El error que recibo es:

  

una excepción de tipo   'System.Runtime.Serialization.SerializationException'   ocurrido en WebDev.WebHost40.dll pero   No fue manejado en el código de usuario

     

Información adicional: Tipo no es   resuelto para el miembro   'Model.Entities.UserIdentity, Modelo,   Version = 1.0.0.0, Culture = neutral,   PublicKeyToken = null'.

¿Hay algunas propiedades adicionales que necesito para poner en práctica en mi identidad con el fin de utilizar una identidad personalizada en MVC? Traté de poner en práctica [Serializable ()] en la clase de identidad pero no parecen tener un impacto.

ACTUALIZACIÓN: He intentado 3-4 formas alternativas de esta práctica, aunque es insuficiente con el mismo error. Si utilizo clases GenericIdentity / GenericPrincipal directamente no lo hace de error.

GenericIdentity ident = new GenericIdentity("jzxcvcx");
GenericPrincipal princ = new GenericPrincipal(ident, null);
Context.User = princ;

Pero esto me lleva a ninguna parte, ya que estoy tratando de utilizar el CustomIdentity para sostener un par de propiedades. Si puedo implementar las interfaces IIdentity / IPrincipal o heredar GenericIdentity / GenericPrincipal para mi CustomIdentity / CustomPrincipal falla con el error original anterior.

¿Fue útil?

Solución

Me imaginé éste hacia fuera con un poco de ayuda de la web :) El truco es que usted tiene que implementar la interfaz ISerializable en su clase que implementa IIdentity. Espero que esto ayude a salvar a otra persona algún tiempo:)

Declaración de clase:

[Serializable]
    public class ForumUserIdentity : IIdentity, ISerializable

Implementación para ISerializable:

#region ISerializable Members

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            if (context.State == StreamingContextStates.CrossAppDomain)
            {
                GenericIdentity gIdent = new GenericIdentity(this.Name, this.AuthenticationType);
                info.SetType(gIdent.GetType());

                System.Reflection.MemberInfo[] serializableMembers;
                object[] serializableValues;

                serializableMembers = FormatterServices.GetSerializableMembers(gIdent.GetType());
                serializableValues = FormatterServices.GetObjectData(gIdent, serializableMembers);

                for (int i = 0; i < serializableMembers.Length; i++)
                {
                    info.AddValue(serializableMembers[i].Name, serializableValues[i]);
                }
            }
            else
            {
                throw new InvalidOperationException("Serialization not supported");
            }
        }

        #endregion

Aquí está el enlace al artículo que tiene más detalle en la "característica"

Otros consejos

Yo tenía el mismo problema. Lo resuelto moviendo mi representada la creación de MvcApplication_AuthenticateRequest a MvcApplication_PostAuthenticateRequest. No sé por qué / cómo, pero se solucionó el problema:)

        void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
    {
        HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie != null)
        {
            string encTicket = authCookie.Value;
            if (!String.IsNullOrEmpty(encTicket))
            {
                FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(encTicket);
                BiamedIdentity id = new BiamedIdentity(ticket);
                GenericPrincipal prin = new GenericPrincipal(id, null);
                HttpContext.Current.User = prin;
            }
        }
    }

Con me parece que funciona cuando heredo mi clase de Identidad de MarshalByRefObject.

También tenga en cuenta: Cuando se utiliza LINQ to SQL no había ningún problema. Cambié a Entidad-Marco y explosión, me dieron el mensaje anterior.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top