2011-07-06 13 views
5

Estoy atascado con la implementación de un objeto personalizado iprincpal e iidentity. Paso un día ahora buscando cómo implementar estos derechos y ampliarlo con más información.Implementación de IPrincipal e IIdentity en MVC con el uso de membresía personalizada y proveedor de roles

Quiero ampliar la información @Context.User.Identity.Name con variables personalizadas como nombre completo u otra cosa.

EDITAR: Ahora tengo el siguiente código pero si trato de leer @((CustomPrincipal)Context.User.Identity).Nachname estoy recibiendo un error que System.Web.Security.FormsIdentity no podía ser moldeado a CustomPrincipal.

¿Alguna idea?

public class CustomPrincipal : GenericPrincipal 
{ 
    public CustomPrincipal(IIdentity identity, String[] roles) : base(identity, roles){ 

    } 
    public String Vorname { get; set; } 
    public String Nachname { get; set; } 
} 

AccountModel:

public class FormsAuthenticationService : IFormsAuthenticationService 
{ 
    public void SignIn(string userName, bool createPersistentCookie) 
    { 
     if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Der Wert darf nicht NULL oder leer sein.", "userName"); 
     // Grab user information to insert 
     KIMembershipUser membershipUser = (KIMembershipUser)Membership.GetUser(userName); 
     var customInfo = String.Format("{0}|{1}", membershipUser.Vorname, membershipUser.Nachname); 
     // Create and encrypt the ticket 
     var ticket = new FormsAuthenticationTicket(
      2, // Version number 
      userName, // Username 
      DateTime.Now, // Issue date 
      DateTime.Now.AddMinutes(30), // Expiration date 
      createPersistentCookie, // Is it persistent? 
      customInfo // User data 
     ); 
     var encTicket = FormsAuthentication.Encrypt(ticket); 
     // Store the ticket into a cookie 
     var cookie = FormsAuthentication.GetAuthCookie(FormsAuthentication.FormsCookieName,createPersistentCookie); 
     cookie.Value = encTicket; 
     // Append the cookie to the response 
     HttpContext.Current.Response.Cookies.Add(cookie); 

     //FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 
    } 

    public void SignOut() 
    { 
     FormsAuthentication.SignOut(); 
    } 
} 

global.asax:

protected void Application_PostAuthenticateRequest(){ 
     // Collect current security information 
     var principal = HttpContext.Current.User as RolePrincipal; 
     if (principal == null) 
      return; 
     var identity = principal.Identity as FormsIdentity; 
     if (identity == null) 
      return; 
     var roles = principal.GetRoles(); 
     // Extract user data in the authentication ticket 
     var customInfo = identity.Ticket.UserData; 
     var tokens = customInfo.Split('|'); 
     // Build a richer principal object 
     var CustomPrincipal = new CustomPrincipal(identity, roles){ 
      Vorname = tokens[0], 
      Nachname = tokens[1] 
     }; 
     // Store the new principal in the HttpContext 
     HttpContext.Current.User = CustomPrincipal; 
    } 
+0

Cuál es el problema con la extensión de las clases GenericPrincipal y GenericIdentity? –

+0

No sabía que hay estos objetos. ¿Cómo extenderlos? – float

+0

Puede que no necesite extender (heredar) de ellos, la forma más fácil de hacerlo es construir una nueva instancia de cada uno de ellos: http://msdn.microsoft.com/en-us/library/y9dd5fx0(v=VS .100) .aspx –

Respuesta

4

Uso (CustomPrincipal)Context.User).Nachname en lugar de (CustomPrincipal)Context.User.Identity).Nachname

Cuestiones relacionadas