加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 00:39:37 所属栏目:asp.Net 来源:网络整理
导读:我有一个基本的MVC 2 beta应用程序,我试图实现一个自定义的身份和Principal类。 我创建了实现IIdentity和IPrincipal接口的类,实例化它们,然后将CustomPrincipal对象分配给Global.asax的Application_AuthenticateRequest中的Context.User。 这一切都成功,
我有一个基本的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”

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读