2015-07-21 18 views
5

Tôi có một ứng dụng với Giao diện sau. Trong Thư mục lượt xem được chia sẻ, tôi có, _Layout.cshtml, _SideNav.cshtml_CurrentUser.cshtml.MVC 5 Đối tượng tài khoản người dùng toàn cầu

Trong _Layout.cshtml tôi có:

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

Trong _SideNav.cshtml tôi có:

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

Trong _CurrentUser.cshtml tôi có:

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

Chúng tôi sử dụng FormsAuthentication để xác thực người dùng . Chúng tôi không sử dụng xác thực chuẩn Identity được giao với ASP.Net MVC 5 vì chúng tôi đang sử dụng Máy chủ LDAP.

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

Chúng tôi sử dụng username trong cookie để chúng ta có thể dễ dàng nhận được thông tin từ máy chủ LDAP.

Sự cố: @User.Identity.Name trả về tên người dùng đó. Nhưng tôi cần hiển thị tên đầy đủ của người dùng. Tôi có quyền truy cập vào tên đầy đủ khi chúng tôi xác thực. nhưng không chắc chắn làm thế nào để sử dụng nó.

Làm cách nào để chuyển giá trị FullName từ AccountController đến chế độ xem một phần của _CurrentUser.cshtml? Loại giống như một Container toàn cầu như @User.Identity với nhiều thuộc tính có thể được thiết lập.

+0

Bạn có lưu trữ dữ liệu tùy chỉnh trong cookie xác thực không? –

+0

Không sử dụng nó ra khỏi hộp như trên. Tôi đã thử một giải pháp để lưu trữ dữ liệu tùy chỉnh nhưng điều đó không hoạt động, nó sẽ không cho phép tôi xác thực. Nếu bạn có một giải pháp cho tôi để thử tôi sẽ cho nó một đi. –

+0

FormsAuthenticationTicket chứa thuộc tính UserData. Điều này là miễn phí để sử dụng. Sau khi bạn giải mã vé, bạn có thể truy cập nó với đối tượng tùy chỉnh đọc và ghi. Đối tượng tùy chỉnh có thể chứa thông tin bổ sung mà bạn cần trong khi vé hợp lệ. –

Trả lời

1

Bạn có thể sử dụng một cái gì đó như thế này

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

Bạn sẽ trừu tượng dữ liệu người dùng đó trong chế độ xem tho như thế nào? –

+0

Khi người dùng đăng nhập và bạn có FullName, hãy tạo đối tượng người dùng chứa mọi thứ bạn muốn. Sau đó, serialize đó vào cookie. Để hiển thị các chi tiết trong '_CurrentUser.cshtml', khung nhìn đó sử dụng đối tượng User như là viewModel, và sau đó hiển thị màn hình truyền cho đối tượng' User' – 3dd

+0

Cảm ơn bạn đã quản lý để làm việc này. Trong tệp '.cshtml' của tôi, tôi đã thêm một khối mã để lấy dữ liệu. Tôi chắc chắn có một cách tốt hơn nhưng nó sẽ hoạt động ngay bây giờ. Tôi đã thử một giải pháp tương tự trước đây nhưng vì một lý do nào đó nó không hoạt động chút nào, không biết tại sao. –

1

Bạn có thể thử một cái gì đó tương tự như ->

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

Tôi nhầm lẫn là nơi mà điều này cần phải đi/phù hợp in Tôi đã thử này, và không hoạt động. http://pastebin.com/ers0ipQ5 –

0

Sử dụng ClaimsIdentity.

Khi người dùng đăng nhập vào ứng dụng của bạn, thêm tên của họ vào danh tính của bạn.

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

Sau đó, tạo ra một phương pháp mở rộng để có được tên của bạn

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

Bây giờ sử dụng nó như @User.GetName()

Cập nhật:

Hoặc trong bạn đăng nhập điều khiển sử dụng UserManager để có được danh tính người dùng . Như sau:

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

AuthenticationManager.SignIn(claims); 
+0

Bạn thêm xác nhận quyền sở hữu vào đâu? –

+0

Thêm xác nhận quyền sở hữu trong bộ điều khiển đăng nhập của bạn – dan

+0

Đây là dành cho ASP.NET Identity. Điều này không hoạt động với FormsAuthentication. –

Các vấn đề liên quan