asp.net-mvc-2 – 在MVC中实现自定义标识和IPrincipal

前端之家收集整理的这篇文章主要介绍了asp.net-mvc-2 – 在MVC中实现自定义标识和IPrincipal前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个基本的MVC 2 beta应用程序,我试图实现一个自定义的身份和Principal类。

我创建了实现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 code

Additional 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,那么它将失败,并出现上面的原始错误

解决方法

我从网络中得到了一些帮助,我想到了这一点:)诀窍是你必须在实现IIdentity的类中实现ISerializable接口。我希望这有助于保存别人一些时间:)

班级申报:

[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

这是link to the article that has more detail on the “Feature”

原文链接:https://www.f2er.com/aspnet/252859.html

猜你在找的asp.Net相关文章