tutorial net mvc asp asp.net-mvc-2 iprincipal iidentity

asp.net-mvc-2 - net - model mvc c#



Implementando una Identidad Personalizada y un Principio de IP en MVC (3)

Conmigo parece funcionar cuando MarshalByRefObject mi clase de identidad de MarshalByRefObject .

También tenga en cuenta: al utilizar Linq-to-Sql no hubo ningún problema. Cambié a Entity-Framework y bang, recibí el mensaje anterior.

Tengo una aplicación beta básica de MVC 2 en la que estoy tratando de implementar clases de Identidad y Principal personalizadas.

He creado mis clases que implementan las interfaces IIdentity y IPrincipal, las instalé y luego asigné el objeto CustomPrincipal a mi Context.User en Application_AuthenticateRequest of Global.asax.

Todo esto tiene éxito y los objetos se ven bien. Cuando comienzo a renderizar las Vistas, las páginas ahora están fallando. El primer error se encuentra en la vista predeterminada LogoOnUserControl en la siguiente línea de código:

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

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

El error que recibo es:

Se produjo una excepción de tipo ''System.Runtime.Serialization.SerializationException'' en WebDev.WebHost40.dll pero no se manejó en el código de usuario

Información adicional: El tipo no se resuelve para el miembro ''Model.Entities.UserIdentity, Model, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null''.

¿Hay algunas propiedades adicionales que necesito implementar en mi Identidad para usar una Identidad personalizada en MVC? Intenté implementar [Serializable ()] en la clase de Identidad pero no pareció tener un impacto.

ACTUALIZACIÓN: He intentado 3-4 formas alternativas de implementado esto pero todavía falla con el mismo error. Si uso las clases GenericIdentity / GenericPrincipal directamente, no se produce ningún error.

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

Pero esto no me lleva a ninguna parte, ya que estoy tratando de usar CustomIdentity para mantener un par de propiedades. Si implemento las interfaces IIdentity / IPrincipal o herido GenericIdentity / GenericPrincipal para mi CustomIdentity / CustomPrincipal, se produce un error con el error original anterior.


Me di cuenta de esto con un poco de ayuda de la web :) El truco es que tienes que implementar la interfaz ISerializable en tu clase que implementa IDdentity. Espero que esto ayude a salvar a alguien más 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 detalles sobre la "Característica"


Yo tuve el mismo problema. Lo resolví moviendo mi creación principal de MvcApplication_AuthenticateRequest a MvcApplication_PostAuthenticateRequest. No sé por qué / cómo, pero resolvió 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; } } }