2015-07-21 11 views
5

Ho un'applicazione con il seguente layout. Nella cartella Viste condivise che ho, _Layout.cshtml, _SideNav.cshtml e _CurrentUser.cshtml.MVC 5 Global Account Account Object

Nel _Layout.cshtml ho:

@{ Html.RenderPartialIf("_SideNav", Request.IsAuthenticated); } 

Nel _SideNav.cshtml ho:

@{ Html.RenderPartial("_CurrentUser"); } 

Nel _CurrentUser.cshtml ho:

<div class="login-info"> 
    <span> 
     <a href="javascript:void(0);" id="show-shortcut" data-action="toggleShortcut"> 
      <img src="~/content/img/avatars/sunny.png" alt="me" class="online" /> 
      <span>@User.Identity.Name</span> 
      <i class="fa fa-angle-down"></i> 
     </a> 
    </span> 
</div> 

Usiamo FormsAuthentication per autenticare un utente . Non stiamo utilizzando l'autenticazione standard Identity fornita con ASP.Net MVC 5 perché stiamo utilizzando un server LDAP.

FormsAuthentication.SetAuthCookie(username, isPersistent); 
..... 
HttpContext.Current.User = new GenericPrincipal(new GenericIdentity(username, "Forms"), roles); 

Usiamo il username in un cookie in modo da poter facilmente ottenere informazioni dal server LDAP.

Problema: @User.Identity.Name restituisce tale nome utente. Ma ho bisogno di visualizzare il nome completo dell'utente. Ho accesso al nome completo quando effettuiamo l'autenticazione. ma non sono sicuro di come usarlo.

Come posso passare il valore FullName da AccountController alla vista parziale _CurrentUser.cshtml? Un po 'come un contenitore globale come @User.Identity con più attributi che possono essere impostati.

+0

Memorizza dati personalizzati nel cookie di autenticazione? –

+0

No, basta usarlo fuori dalla scatola come sopra. Ho provato una soluzione per archiviare dati personalizzati ma non ha funzionato, non mi ha permesso di autenticarmi affatto. Se hai una soluzione da provare, ci provo. –

+0

FormsAuthenticationTicket contiene una proprietà UserData. Questo è gratis da usare. Dopo aver decrittografato il biglietto, è possibile accedervi con oggetti personalizzati letti e scritti. L'oggetto personalizzato può contenere informazioni aggiuntive necessarie mentre il ticket è valido. –

risposta

1

si può usare qualcosa di simile

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, 
                   viewModel.Email, 
                   YOUR_ISSUE_DATE, 
                   YOUR_EXPIRE_DATE, 
                   viewModel.RememberMe, 
                   JsonConvert.SerializeObject(user), 
                   FormsAuthentication.FormsCookiePath); 


string hash = FormsAuthentication.Encrypt(ticket); 
HttpCookie authcookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash); 

Response.Cookies.Add(authcookie); 
+0

Come vorresti astrarre i dati dell'utente nella vista? –

+0

Quando l'utente si collega e si dispone di FullName, creare un oggetto utente contenente tutto ciò che si desidera. Quindi serializzalo nel cookie. Per visualizzare i dettagli in '_CurrentUser.cshtml' avere quella vista usa l'oggetto User come viewModel, e quindi renderizza lo schermo passandogli l'oggetto' User' – 3dd

+0

Grazie a te sono riuscito a far funzionare questo. Nel mio file '.cshtml' ho aggiunto un blocco di codice per catturare i dati. Sono sicuro che c'è un modo migliore ma funzionerà per ora. Ho provato una soluzione simile prima ma per qualche motivo non ha funzionato affatto, non ho idea del perché. –

1

Si può provare qualcosa di simile a ->

public static MyAuthenticationTicket GetIMyUserTicket() 
{ 
    //Get custom user data object from forms auth cookie 
    MyAuthenticationTicket result= null; 
    if (HttpContext.Current.User == null) 
     return null; 
    if (!HttpContext.Current.Request.IsAuthenticated) 
     return null; 
    FormsIdentity ident = (FormsIdentity)HttpContext.Current.User.Identity; 
    if (ident == null) 
     return null; 
    FormsAuthenticationTicket ticket = ident.Ticket; 
    if (ticket == null) 
     return null; 
    if (!FormsAuthentication.CookiesSupported) 
    {    
     //If cookie is not supported for forms authentication, then the 
     //authentication ticket is stored in the Url, which is encrypted. 
     //So, decrypt it 
     ticket = FormsAuthentication.Decrypt(ident.Ticket.Name); 

    } 

    string userDataString = ticket.UserData; 
    if(!String.IsNullOrEmpty(userDataString)) 
     result= new MyAuthenticationTicket(userDataString); 

    return result;  
} 
+0

Sono confuso su dove questo debba andare/si adatta. L'ho provato e non funziona. http://pastebin.com/ers0ipQ5 –

0

Usa ClaimsIdentity.

Quando l'utente accede alla tua app aggiunge il suo nome alla tua identità.

ClaimsIdentity claims = new ClaimsIdentity(); 
claims.AddClaim(new Claim("name", "value")); 

quindi creare un metodo di estensione per ottenere il vostro nome

public static string GetName(this IPrincipal principal) 
{ 
    return ((ClaimsIdentity)principal.Identity).Claims.Where(x => x.Type == "name").FirstOrDefault().Value; 
} 

Ora lo usano come @User.GetName()

Aggiornamento:

O in si effettua il login al controller UserManager per ottenere l'identità dell'utente . In questo modo:

ClaimsIdentity claims = UserManager.CreateIdentityAsync(user, CookieAuthenticationDefaults.AuthenticationType); 
claims.Add(new Claim("name" , "value")); 

AuthenticationManager.SignIn(claims); 
+0

Dove si aggiungono le attestazioni? –

+0

Aggiungi attestazioni nel controller di login – dan

+0

Questo è per l'identità di ASP.NET. Questo non funziona con FormsAuthentication. –