19

カスタムの Identity クラスと Principal クラスを実装しようとしている基本的な MVC 2 ベータ アプリがあります。

IIdentity インターフェイスと IPrincipal インターフェイスを実装するクラスを作成し、それらをインスタンス化し、Global.asax の Application_AuthenticateRequest で CustomPrincipal オブジェクトを Context.User に割り当てました。

これはすべて成功し、オブジェクトはきれいに見えます。ビューのレンダリングを開始すると、ページが失敗します。最初の失敗は、次のコード行のデフォルトの LogoOnUserControl ビューにあります。

 [ <%= Html.ActionLink("Log Off", "LogOff", "Account") %> ]

これを引き出すと、別の「Html.ActionLink」コード行で失敗します。

私が受け取るエラーは次のとおりです。

タイプ 'System.Runtime.Serialization.SerializationException' の例外が WebDev.WebHost40.dll で発生しましたが、ユーザー コードで処理されませんでした

追加情報: メンバー 'Model.Entities.UserIdentity,Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' の型が解決されていません。

MVC でカスタム ID を使用するために、ID に実装する必要がある追加のプロパティはありますか? [Serializable()] を Identity クラスに実装しようとしましたが、影響がないようです。

更新: これを実装するための 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 を継承すると、上記の元のエラーで失敗します。

4

3 に答える 3

11

私も同じ問題を抱えていました。プリンシパル作成をMvcApplication_AuthenticateRequestからMvcApplication_PostAuthenticateRequestに移動することで解決しました。理由/方法はわかりませんが、問題は解決しました:)

        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;
            }
        }
    }
于 2010-12-10T22:30:11.313 に答える
4

から Identity クラスを継承するとうまくいくようですMarshalByRefObject

また、注意: Linq-to-Sql を使用する場合、問題はありませんでした。Entity-Framework に切り替えて強打すると、上記のメッセージが表示されました。

于 2010-07-09T15:36:47.477 に答える