He escrito un objeto principal personalizado que contiene algunos campos adicionales (correo electrónico y ID de usuario además del nombre de usuario).¿Cómo puedo hacer que acceder a mi IPrincipal personalizado sea más fácil en ASP.NET MVC?
Para acceder a estas propiedades tengo que convertir el objeto Context.User como mi principal personalizado.
@Html.GetGravitarImage((User as CustomPrincipal).Email)
Este principal personalizada se crea/deserializado a través de la Application_AuthenticateRequest en mi global.ascx. Puede ver esta pregunta que le pedí al here para más información.
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);
}
Sin embargo, si un usuario no está autenticado, entonces mi yeso para CustomPrincipal fallará (porque no se inyectará en el método anterior) y el resultado de la (User como CustomPrincipal) devolverá nulo , por lo tanto, me da una excepción de referencia nula cuando mi método anterior intenta obtener el correo electrónico.
¿Cuál sería una solución limpia a este problema? Quiero hacer que el acceso a mi director de aduana fácil y tener que hacer lo siguiente parece engorroso:
@Html.GetGravitarIcon((User is CustomPrincipal) ? (User as CustomPrincipal).Email : "Default Email")
Es esta la única manera de manejar esta situación?
Simplemente me podría ser, pero me parece extensión métodos molestos para cosas comunes, a menos que estén definidos en un espacio de nombres común. No puedes simplemente presionar Ctrl-. para incluirlo automáticamente como es normal en Visual Studio. –
Personalmente los amo, pero creo que cada uno es suyo. Esto podría colocarse en el espacio de nombres System.Web.Mvc o algo así para que siempre se recoja. –
Estoy tratando de entender esto en este momento y no entiendo qué es MyUserClass. ¿Podría explicar por favor? – LukeP