2015-07-21 40 views
5

Mam aplikację o następującym układzie. W folderze Shared Views Folder mam: _Layout.cshtml, _SideNav.cshtml i _CurrentUser.cshtml.MVC 5 Konto globalne Konto użytkownika Obiekt

W _Layout.cshtml mam:

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

W _SideNav.cshtml mam:

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

W _CurrentUser.cshtml mam:

<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> 

Używamy FormsAuthentication do uwierzytelniania użytkownika . Nie używamy standardowego uwierzytelnienia Identity, które jest dostarczane z ASP.Net MVC 5, ponieważ używamy serwera LDAP.

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

Używamy username w pliku cookie, dzięki czemu możemy łatwo uzyskać informacje z serwera LDAP.

Problem: @User.Identity.Name zwraca tę nazwę użytkownika. Ale muszę wyświetlić pełną nazwę użytkownika. Mam dostęp do pełnej nazwy po uwierzytelnieniu. ale nie wiem, jak z niego korzystać.

Jak mogę przekazać wartość FullName z AccountController do częściowego widoku _CurrentUser.cshtml? Rodzaj globalnego kontenera, takiego jak @User.Identity z większą liczbą atrybutów, które można ustawić.

+0

Czy przechowujesz niestandardowe dane w pliku cookie służącym do uwierzytelniania? –

+0

Nie używam go po wyjęciu z pudełka, jak na powyższym. Próbowałem rozwiązania do przechowywania niestandardowych danych, ale to nie zadziałało, nie pozwoliłoby mi na uwierzytelnienie. Jeśli masz dla mnie rozwiązanie, spróbuję. –

+0

FormularzAuthenticationTicket zawiera właściwość UserData. To jest bezpłatne. Po odszyfrowaniu biletu można uzyskać do niego dostęp za pomocą niestandardowego obiektu do odczytu i zapisu. Obiekt niestandardowy może zawierać dodatkowe informacje, których potrzebujesz, gdy bilet jest ważny. –

Odpowiedz

1

można użyć coś jak ten

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

W jaki sposób streszczycie dane użytkownika w widoku? –

+0

Gdy użytkownik się loguje, a użytkownik ma nazwę FullName, utwórz obiekt użytkownika zawierający wszystkie potrzebne elementy. Następnie serializuj to do pliku cookie. Aby wyświetlić szczegóły w '_CurrentUser.cshtml', należy użyć tego obiektu User jako viewModel, a następnie uczynić ekran przekazujący mu obiekt' User'. – 3dd

+0

Dziękuję, że udało mi się go uruchomić. W moim pliku '.cshtml' dodałem blok kodu, aby pobrać dane. Jestem pewien, że jest lepszy sposób, ale na razie zadziała. Próbowałem wcześniej podobne rozwiązanie, ale z jakiegoś powodu nie działało, nie mam pojęcia dlaczego. –

1

Można spróbować czegoś podobnego do ->

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

Nie mam pojęcia, gdzie to musi pasować. Próbowałem tego i nie działa. http://pastebin.com/ers0ipQ5 –

0

użytkowania ClaimsIdentity.

Po zalogowaniu się użytkownika w aplikacji dodaj jego nazwę do swojej tożsamości.

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

Następnie należy utworzyć metodę rozszerzenia aby uzyskać nazwę

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

teraz używać go jako @User.GetName()

Aktualizacja:

Albo zalogować wykorzystanie kontrolera UserManager uzyskać tożsamość użytkownika . Na przykład:

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

AuthenticationManager.SignIn(claims); 
+0

Gdzie można dodać roszczenia? –

+0

Dodaj roszczenia w kontrolerze logowania – dan

+0

Jest to dla tożsamości ASP.NET. To nie działa z FormsAuthentication. –

Powiązane problemy