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