我写了一个自定义主体对象,其中包含一些额外的字段(电子邮件和用户名除外)。如何在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 ,当我上面的方法试图获得电子邮件时,给我一个空引用异常。
什么是这个问题的干净解决方案?我要让我的访问自定义主体轻松,不必做以下似乎繁琐:
@Html.GetGravitarIcon((User is CustomPrincipal) ? (User as CustomPrincipal).Email : "Default Email")
这是处理这种情况的唯一途径?
这可能只是我,但我发现扩展方法讨厌常见的东西,除非它们是在一个通用的命名空间中定义的。你不能只点击Ctrl-。在Visual Studio中自动包含它。 –
我个人很喜欢它们,但每个都是属于我自己的。这可以放在System.Web.Mvc命名空间或其他东西中,所以它总是被拾取。 –
我试图让我的头在此刻,我不明白MyUserClass是什么。你能解释一下吗? – LukeP