6

Tôi đã bắt đầu một dự án ASP.NET MVC 2 và tôi đang xây dựng mã được tạo tự động.Cách tải cấu hình của người dùng mới đăng nhập trước khi chuyển hướng

Sự cố mà tôi đang gặp phải là sau khi người dùng đăng nhập, có vẻ như hồ sơ của người dùng mới đăng nhập không được tải vào HttpContext, vì vậy tôi nhận được ProviderException với thông báo "Thuộc tính này không thể được đặt cho người dùng ẩn danh "khi cố đặt giá trị thuộc tính trong tiểu sử của người dùng hiện tại.

Đối với hành động Logon POST-chỉ, Visual Web Developer 2010 Express về cơ bản được tạo ra:

[HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsService.SignIn(model.UserName, model.RememberMe); 
     //... 

nơi FormsService là một tài sản của bộ điều khiển kiểu FormsAuthenticationService (cũng tạo ra):

public class FormsAuthenticationService : IFormsAuthenticationService 
{ 
    public void SignIn(string userName, bool createPersistentCookie) 
    { 
     if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName"); 

     FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 
    } 

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

Sau dòng FormsService.SignIn(model.UserName, model.RememberMe) tôi giả định rằng thông tin cho tài khoản mới đăng nhập sẽ có sẵn ngay lập tức cho bộ điều khiển, nhưng điều này có vẻ không đúng. Ví dụ: nếu tôi thêm profile.SetPropertyValue("MyProfileProperty", "test") bên dưới cuộc gọi vào FormsService # SignIn, thì tôi nhận được số ProviderException "Không thể đặt thuộc tính này cho người dùng ẩn danh".

Làm cách nào để tải tiểu sử của người dùng mới đăng nhập vào HttpContext để tôi có thể đặt giá trị thuộc tính trong tiểu sử của họ trước yêu cầu tiếp theo?

Trả lời

6

Việc đặt tên của hàm là truy cập trực quan, nhưng ProfileBase.Create (username) sẽ nạp cấu hình hiện tại cho một người dùng có sẵn hoặc tạo một hồ sơ mới nếu không tồn tại.

var profile = ProfileBase.Create(userName); 

Điều này sẽ không tải cấu hình vào ControllerContext.HttpContext.Profile nhưng ít nhất bạn có thể truy cập hoặc thay đổi hồ sơ người dùng.

+0

Điều đó sẽ tạo một hồ sơ mới, không tải hồ sơ hiện có. –

+0

Không, bạn sai khi giả định rằng, nó sẽ tải một hồ sơ hiện có. Hãy dùng thử. –

+1

"Mất một thời gian cho đến khi tôi nhận ra rằng việc gọi ProfileBase.Create() với một tên người dùng làm đối số thực hiện tra cứu đối với TableStorage và thực sự truy xuất dữ liệu liên quan đến tên người dùng đó. Như tôi đã nói, gọi phương thức này Create() là sai lầm, tôi mong đợi Load() hoặc Get(). " xem câu trả lời cho câu hỏi này: http://stackoverflow.com/questions/1126719/asp-net-sql-profile-provider-does-the-profilebase-create-method-hit-db –

1

Xác thực biểu mẫu "thô" được tích hợp vào mẫu MVC không tự động tải cấu hình. Tất cả những gì nó làm là xác thực người dùng dựa trên các bảng Membership và thiết lập cookie đăng nhập. Nếu bạn muốn dữ liệu hồ sơ vẫn kiên trì trong trạng thái Phiên giao dịch ngày đăng nhập, bạn sẽ phải làm điều đó một cách rõ ràng:

[HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsService.SignIn(model.UserName, model.RememberMe); 
       LoadProfile(model.UserName); 
      } 
    } 

    private void LoadProfile(string UserName) 
    { 
      MyModelContext ctx = new MyModelContext(); //EF or LINQ2SQL context 
      var user = ctx.Users.Where(u => u.UserName == UserName).FirstOrDefault(); 
      Session.Add("CurrentUser", user); 
    } 

UPDATE:

tôi hiểu lầm câu hỏi ban đầu. Bạn phải tạo và lưu hồ sơ của loại ProfileCommon cho người dùng ẩn danh. Xem bài đăng này:

http://forums.asp.net/p/1150958/2619264.aspx

+0

Tôi giả sử tiểu sử được tải vào Phiên khi trang "tiếp theo" được tải sau khi đăng nhập. Có đúng không? –

+0

@Nick: Trong triển khai này, tiểu sử được tải vào phiên ngay sau khi xác thực, trước khi chuyển hướng. –

+0

Đây có thể là một câu hỏi ngớ ngẩn, nhưng làm thế nào để tải hồ sơ này ('ControllerContext.HttpContext.Profile') của người dùng mới đăng nhập? –

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