Я написал специальный объект-принципал, который содержит несколько дополнительных полей (адрес электронной почты и идентификатор пользователя в дополнение к имени пользователя).
По порядку. чтобы получить доступ к этим свойствам, я должен привести объект Context.User в качестве моего настраиваемого принципала.
@Html.GetGravitarImage((User as CustomPrincipal).Email)
Этот настраиваемый принципал создается / десериализуется с помощью Application_AuthenticateRequest в моем global.ascx. Вы можете увидеть этот вопрос, который я задал здесь для получения дополнительной информации.
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, что даст мне исключение с нулевой ссылкой, когда мой метод выше пытается получить электронное письмо.
Каким будет чистое решение этой проблемы? Я хочу упростить доступ к своему настраиваемому принципалу, и необходимость сделать следующее кажется обременительным:
@Html.GetGravitarIcon((User is CustomPrincipal) ? (User as CustomPrincipal).Email : "Default Email")
Это единственный способ справиться с этой ситуацией?