Question

J'ai une application bêta MVC 2 de base où je suis en train de mettre en œuvre une identité personnalisée et les classes principales.

J'ai créé mes classes qui implémentent les interfaces IIdentity et IPrincipal, les instancié, puis affecté l'objet CustomPrincipal à mon Context.User dans Application_AuthenticateRequest du Global.asax.

Cela réussit tous les objets et bien paraître. Quand je commence à rendre les vues les pages sont maintenant en échec. Le premier échec est dans la vue LogoOnUserControl par défaut sur la ligne de code suivante:

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

Si je tire ceci il échoue sur une ligne « Html.ActionLink » différent du code.

L'erreur que je reçois est:

  

Une exception de type   'System.Runtime.Serialization.SerializationException'   eu lieu dans WebDev.WebHost40.dll mais   n'a pas été traitée dans le code utilisateur

     

Informations complémentaires: Type ne   résolue pour les membres   « Model.Entities.UserIdentity, modèle,   Version = 1.0.0.0, Culture = neutral,   PublicKeyToken = null ».

Y at-il des propriétés supplémentaires que je dois mettre en œuvre dans mon identité afin d'utiliser une identité personnalisée dans MVC? J'ai essayé de mettre en œuvre [Serializable ()] dans la classe d'identité, mais il ne semble pas avoir un impact.

Mise à jour: J'ai essayé 3-4 d'autres moyens de mise en œuvre, mais cela ne fonctionne toujours pas avec la même erreur. Si j'utilise des classes GenericIdentity / GenericPrincipal directement ce ne est pas erreur.

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

Mais cela me mène nulle part depuis que je suis en train d'utiliser le CustomIdentity pour tenir quelques propriétés. Si je mets en œuvre les IIdentity / interfaces IPrincipal ou hériterai GenericIdentity / GenericPrincipal pour mon CustomIdentity / CustomPrincipal il échoue avec l'erreur d'origine ci-dessus.

Était-ce utile?

La solution

Je me suis dit celui-ci avec un peu d'aide sur le web :) L'astuce est que vous devez implémenter l'interface ISerializable dans votre classe qui implémente IIdentity. J'espère que cette aide sauver quelqu'un d'autre temps:)

Déclaration de la classe:

[Serializable]
    public class ForumUserIdentity : IIdentity, ISerializable

Mise en œuvre pour 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

Voici le à l'article que a plus de détails sur la "Feature"

Autres conseils

J'ai eu le même problème. Je l'ai résolu en déplaçant mon directeur de la création MvcApplication_AuthenticateRequest à MvcApplication_PostAuthenticateRequest. Je ne sais pas pourquoi / comment, mais il a résolu le problème:)

        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;
            }
        }
    }

Avec moi, il semble fonctionner quand je hérité ma classe d'identité de MarshalByRefObject.

A noter également: lors de l'utilisation Linq-à-Sql il n'y avait pas de problème. Je suis passé à l'entité-cadre et bang, je reçu le message ci-dessus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top