我创建了实现IIdentity和IPrincipal接口的类,实例化它们,然后将CustomPrincipal对象分配给Global.asax的Application_AuthenticateRequest中的Context.User。
这一切都成功,对象看起来不错。当我开始渲染视图时,页面现在失败。第一个失败是在以下代码行的默认logoOnUserControl视图中:
[ <%= Html.ActionLink("Log Off","logoff","Account") %> ]
如果我把它拉出来,然后在不同的“Html.ActionLink”代码行失败。
我收到的错误是:
An exception of type
‘System.Runtime.Serialization.SerializationException’
occurred in WebDev.WebHost40.dll but
was not handled in user codeAdditional information: Type is not
resolved for member
‘Model.Entities.UserIdentity,Model,
Version=1.0.0.0,Culture=neutral,
PublicKeyToken=null’.
在我的身份中需要实现一些额外的属性,以便在MVC中使用自定义标识?我试图在Identity类中实现[Serializable()],但它似乎没有影响。
更新:
我已经尝试了3-4种替代方法来实现这一点,但是仍然失败,同样的错误。如果我直接使用GenericIdentity / GenericPrincipal类,它不会出错。
GenericIdentity ident = new GenericIdentity("jzxcvcx"); GenericPrincipal princ = new GenericPrincipal(ident,null); Context.User = princ;
但是,这让我无处可寻,因为我试图使用CustomIdentity来保存几个属性。如果我实现了IIdentity / IPrincipal接口,或者为我的CustomIdentity / CustomPrincipal继承了GenericIdentity / GenericPrincipal,那么它将失败,并出现上面的原始错误。
解决方法
班级申报:
[Serializable] public class ForumUserIdentity : IIdentity,ISerializable
实现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