using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.ComponentModel.DataAnnotations; using Sleis.Validation.Attribute; using System.Security.Principal; using System.Runtime.Serialization; using System.Reflection; using System.Web.Security; namespace Sleis.Models { //We inherit from MarshalByRefObject since .NET 4.5 introduces the ClaimsIdentity class. ClaimsIdentity class is only injected as basetype when debugging against Cassini. //To avoid this, we inherit from MarshalByRefObject //http://www.logue.com.ar/blog/2007/12/cassini-serializationexception-type-is-not-resolved-for-member/ [Serializable] public class SleisVisit : MarshalByRefObject, IIdentity, ISerializable { private readonly FormsAuthenticationTicket _ticket; public SleisVisit() { } public SleisVisit(FormsAuthenticationTicket ticket) { _ticket = ticket; } public string AuthenticationType { get { return FormsAuthentication.FormsCookieName; } } public bool IsAuthenticated { get { return _ticket != null; } } public string Name { get { return (_ticket == null) ? "anon" : _ticket.Name; } } public int Id { get { return (_ticket == null || String.IsNullOrEmpty(_ticket.UserData)) ? 0 : Convert.ToInt32(_ticket.UserData); } } public override string ToString() { return Utility.ReflectionUtility.GetPublicPropertiesString(this); } public bool Expired { get { return _ticket!=null && _ticket.Expired; } } 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"); } /* if (context.State == StreamingContextStates.CrossAppDomain) { GenericIdentity ident = new GenericIdentity(this.Name, this.AuthenticationType); info.SetType(ident.GetType()); MemberInfo[] serializableMembers = FormatterServices.GetSerializableMembers(ident.GetType()); object[] serializableValues = FormatterServices.GetObjectData(ident, serializableMembers); for (int i = 0; i < serializableMembers.Length; i++) { if(GetMemberValue(serializableMembers[i], ident)!=null) info.AddValue(serializableMembers[i].Name, serializableValues[i]); } } else { throw new InvalidOperationException("Serialization not supported"); } * */ } public static object GetMemberValue(MemberInfo member, object target) { switch (member.MemberType) { case MemberTypes.Field: return ((FieldInfo)member).GetValue(target); case MemberTypes.Property: try { return ((PropertyInfo)member).GetValue(target, null); } catch (TargetParameterCountException e) { throw new ArgumentException("MemberInfo has index parameters", "member", e); } default: throw new ArgumentException("MemberInfo is not of type FieldInfo or PropertyInfo", "member"); } } } }