私はいくつかの追加フィールド(ユーザー名に加えて電子メールとユーザーID)を含むカスタムプリンシパルオブジェクトを作成しました。ASP.NET MVCでカスタムIPrincipalに簡単にアクセスできるようにするにはどうすればよいですか?
これらのプロパティにアクセスするには、私のカスタムプリンシパルとしてContext.Userオブジェクトをキャストする必要があります。
@Html.GetGravitarImage((User as CustomPrincipal).Email)
このカスタムプリンシパルは、global.ascx内のApplication_AuthenticateRequestを使用して作成/逆シリアル化されます。あなたはこの質問を見ることができます。詳細はhereにお尋ねします。
ユーザーが認証されていない場合private void Application_AuthenticateRequest(Object source, EventArgs e)
{
var application = (HttpApplication)source;
var context = application.Context;
// Get the authentication cookie
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = context.Request.Cookies[cookieName];
if (authCookie == null)
return;
var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
context.User = CustomPrincipal.CreatePrincipalFromCookieData(authTicket.UserData);
}
しかし、その後、(それは上記の方法で注入されることはありませんので)CustomPrincipalに私のキャストが失敗し、(CustomPrincipalなどのユーザー)の結果がnullを返します。上記の方法でメールを取得しようとするとnull参照例外が発生します。
この問題を解決するにはどうすればよいですか?カスタムプリンシパルに簡単にアクセスできるようにしたいのですが、次のようにするのは面倒です。
@Html.GetGravitarIcon((User is CustomPrincipal) ? (User as CustomPrincipal).Email : "Default Email")
これはこの状況を処理する唯一の方法ですか?
それは私だけかもしれないが、私は拡張子を見つけます一般的な名前空間に定義されていない限り、一般的なことに迷惑をかける方法。 Ctrl-をクリックするだけではいけません。 Visual Studioで通常のように自動的にインクルードします。 –
私は個人的に私はそれらを愛するが、それぞれ自分自身に私は推測する。これはSystem.Web.Mvc名前空間などに置くことができ、常に取得されます。 –
私は現時点でこれについて私の頭を浮かそうとしており、私はMyUserClassが何であるか理解していません。説明していただけますか? – LukeP