Как мне упростить доступ к моему настраиваемому IPrincipal в ASP.NET MVC?

Я написал специальный объект-принципал, который содержит несколько дополнительных полей (адрес электронной почты и идентификатор пользователя в дополнение к имени пользователя).

По порядку. чтобы получить доступ к этим свойствам, я должен привести объект 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")

Это единственный способ справиться с этой ситуацией?

9
задан Community 23 May 2017 в 12:21
поделиться