2009-08-21 15 views
7

Đối với các hành động của tôi sẽ tương tác với tài khoản của người dùng, tôi muốn tạo đối tượng "Người dùng" ngoài việc thêm đối tượng đó vào "ViewData [" TheUser "]" ngay sau khi bất kỳ hành động nào trên bộ điều khiển của tôi được gọi.Xác định người dùng bằng User.Identity.Name trong hàm tạo điều khiển

Nếu người dùng đăng nhập, nó sẽ lấy thông tin của người dùng từ cơ sở dữ liệu, nếu không, đối tượng "Người dùng" sẽ chỉ là rỗng.

Tôi đã thử truy cập "User.Identity.Name" trong hàm tạo bộ điều khiển nhưng chưa được tạo trước khi thực hiện bất kỳ hành động nào.

Tôi đã xem bộ lọc ủy quyền tùy chỉnh, nhưng những bộ lọc đó sẽ không cho phép tôi tạo đối tượng "Người dùng" và lưu trữ nó trong Chế độ xem.

Đây là một đoạn ngắn gọn về những gì tôi muốn đạt được:

[Authorize] 
public class HomeController : Controller 
{ 
    User TheUser; 

    public HomeController() 
    { 
     TheUser = User.Identity.IsAuthenticated ? UserRepository.GetUser(User.Identity.Name) : null; 

     ViewData["TheUser"] = TheUser; 
    } 
} 
+0

câu trả lời này đã giúp tôi cho MVC3 http://stackoverflow.com/a/1506311/511438 –

Trả lời

15

Tôi đã tạo lớp Bộ điều khiển cơ sở tùy chỉnh và thêm thuộc tính "Người dùng hiện tại" vào nó.

Trong phương thức Initialize, tôi đã đặt logic để có được người dùng và sau đó thêm nó vào ViewData và thuộc tính "CurrentUser" của bộ điều khiển.

tôi đã điều khiển của tôi kế thừa lớp tùy chỉnh điều khiển cơ bản và tôi đã có thể tham khảo "CurrentUser" biến bất cứ nơi nào trong bộ điều khiển:

public class CustomControllerClass : Controller 
{ 
    public User CurrentUser { get; set; } 

    protected override void Initialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     if (requestContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      string userName = requestContext.HttpContext.User.Identity.Name; 
      CurrentUser = UserRepository.GetUser(userName); 
     } 

     ViewData["CurrentUser"] = CurrentUser;     
    } 
} 
+0

Khi tôi kế thừa Controller của tôi từ một BaseController, tất cả các yêu cầu web của tôi dừng lại sau khi thực thi phương thức Execute của BaseController và không đi đến phương thức Action. Tôi nhận được một trang trống trong trình duyệt. Có điều gì hơn chúng ta phải làm cho việc này không? – teenup

+0

Puneet, hãy xem bản chỉnh sửa của tôi. Câu trả lời ban đầu của tôi là cho ASP.NET MVC 1. Tôi đã cập nhật nó để ghi đè phương thức 'Initialize' vì đó là nơi chấp nhận để làm điều này trong MVC 2 và 3 – Omar

+0

Cảm ơn bạn rất nhiều, tôi thực sự apreciated này. Nhìn một thời gian dài, câu trả lời của bạn là tốt đẹp và súc tích. –

1

Liệu người dùng đã được khởi tạo cho mỗi hành động điều khiển hoặc chỉ những người cụ thể?

Nếu bạn tạo một ActionFilterAttribute, bạn có quyền truy cập vào ngữ cảnh Bộ điều khiển. Không chắc chắn nếu điều đó là đúng cho AuthorizationFilters, nhưng bạn có thể thử một cái gì đó như thế này:

public class MyCustomFilter: ActionFilterAttribute 
{ 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.Controller.ViewData["TheUser"] = User.Identity.IsAuthenticated ? UserRepository.GetUser(User.Identity.Name) : null; 
     base.OnActionExecuting(filterContext); 
    } 
} 

Sau đó, đính kèm với hành động điều khiển cần thiết.

+0

theuser Nó được sử dụng cho mọi hành động. Câu hỏi của tôi là mặc dù [Ủy quyền] đảm bảo người dùng được xác thực, tôi không có quyền truy cập vào User.Identity, nhưng tôi có thể truy cập ViewData. – Omar

4

tôi thiết lập bộ điều khiển cơ sở của tôi trong một cách tương tự bằng cách sử dụng phương pháp constuctor, và tôi đã có thể đọc thông tin Người dùng này trên mannner sau. Lưu ý: Tôi chỉ lưu trữ UserId, không phải đối tượng User, nhưng điểm của mã của tôi là hiển thị cách bạn có thể nhận được thông tin được yêu cầu trong phương thức contriuctor.

public abstract class BaseController : Controller 
{ 
    int _UserId = 0; 

    public int UserId 
    { 
     get { return _UserId; } 
     set { _UserId = value; } 
    } 

    public BaseController() 
    { 
     var userFromAuthCookie = System.Threading.Thread.CurrentPrincipal; 

     if (userFromAuthCookie != null && userFromAuthCookie.Identity.IsAuthenticated) // && !String.IsNullOrEmpty(userFromAuthCookie.Identity.Name)) 
     { 
      busUser userBO = AceFactory.GetUser(); 
      string userNameFromAuthCookie = userFromAuthCookie.Identity.Name; 
      _UserId = userBO.GetUserIdByUsername(userNameFromAuthCookie); 
     } 
    } 
+0

Tôi cũng đang cố gắng trả lại người dùng bằng User.Identity - 'System.Threading.Thread.CurrentPrincipal' đã sửa nó cho tôi - cảm ơn rất nhiều – wheelibin

3
public abstract class YourController : Controller 
{ 
    public YourController() 
    { 
     var user = System.Threading.Thread.CurrentPrincipal; 

     TheUser = User.Identity.IsAuthenticated ? UserRepository.GetUser(user.Identity.Name) : null; 

     ViewData["TheUser"] = TheUser; 
    } 
} 
Các vấn đề liên quan