我编写了一个自定义主体对象,其中包含一些附加字段(除了用户名之外的电子邮件和用户 ID)。
为了访问这些属性,我必须将 Context.User 对象转换为我的自定义主体。
@Html.GetGravitarImage((User as CustomPrincipal).Email)
这个自定义主体是通过我的 global.ascx 中的 Application_AuthenticateRequest 创建/反序列化的。您可以查看我在此处询问的这个问题以获取更多信息。
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 的转换将失败(因为它不会被注入到上面的方法中)并且 (User as CustomPrincipal) 的结果将返回 null,从而给我一个 null 引用当我上面的方法尝试获取电子邮件时出现异常。
什么是这个问题的干净解决方案?我想让访问我的自定义主体变得容易,并且必须执行以下操作似乎很麻烦:
@Html.GetGravitarIcon((User is CustomPrincipal) ? (User as CustomPrincipal).Email : "Default Email")
这是处理这种情况的唯一方法吗?