2013-08-21 48 views
5

Tôi đang phát triển một ứng dụng Intranet.NET MVC. Tôi cần lưu trữ chi tiết người dùng như vị trí, Số ID, v.v ... liên quan đến từng người dùng được xác thực.Cách tốt nhất để duy trì chi tiết người dùng đã được xác thực trong ứng dụng ASP.NET Intranet MVC

Trong các ứng dụng .NET Webform, chúng tôi sử dụng để lưu chi tiết người dùng đã đăng nhập trong phiên. Nhưng thực hành tốt nhất trong ứng dụng .NET MVC là gì?

+1

** [Kiểm tra bài đăng này. Có thể bạn thấy điều này hữu ích] (http://stackoverflow.com/a/17199709/2015869) ** –

+0

Cảm ơn bạn đã nhập. Nhưng tôi đọc ở đâu đó rằng "TempData có nghĩa là một ví dụ rất ngắn ngủi, và bạn chỉ nên sử dụng nó trong thời gian hiện tại và các yêu cầu tiếp theo mà thôi." Có cách nào để duy trì dữ liệu trên một phiên người dùng cụ thể không? –

+0

Bạn có đang sử dụng xác thực cửa sổ hoặc xác thực biểu mẫu không? Bạn có một cơ sở dữ liệu? –

Trả lời

1

Bạn vẫn có thể sử dụng trạng thái phiên trong MVC, nhưng không được khuyến khích. MVC như một khuôn mẫu tôn trọng trạng thái không trạng thái của HTTP.

Một cách khác là sử dụng Bộ nhớ cache chỉ lưu trữ thông tin trong bộ nhớ. Dưới đây là một câu hỏi SO với nhiều thông tin: Why would ASP.NET MVC use session state?

đây là một trong hơn: Is it a good practice to avoid using Session State in ASP.NET MVC? If yes, why and how?

1

Có một vài cách để da mèo này, nhưng tôi muốn lập luận rằng gắn thông tin hồ sơ cho người sử dụng sẽ là nhất thanh lịch.

Bạn sẽ cần một Nhà cung cấp hồ sơ sẽ duy trì dữ liệu hồ sơ của người dùng của bạn. Bạn có thể sử dụng SqlProfileProvider cho SQL Server, nhưng tôi khuyên bạn nên xem xét các nhà cung cấp Microsoft ASP.NET Universal ref: http://www.nuget.org/packages/Microsoft.AspNet.Providers

Một số bản sao không được dán và dán từ Scott Hanselman theo sau. Hãy nói rằng bạn muốn theo dõi ngày sinh nhật của người dùng:

public class MyCustomProfile : ProfileBase 
{ 
    public DateTime? Birthdate { 
     get { return this["Birthdate"] as DateTime?; } 
     set { this["Birthdate"] = value; } 
    } 
} 

Sau đó, bạn muốn thiết lập nó trong web.config của bạn:

<profile inherits="MyApp.Models.MyCustomProfile" defaultprovider="DefaultProfileProvider"></profile> 

Cuối cùng, bạn có thể kéo trong hồ sơ cá nhân tùy chỉnh của người sử dụng hiện tại với:

var customProfile = HttpContext.Profile as MyCustomProfile; 

DateTime? birthday = customProfile.Birthdate; 

Bạn sẽ phải thiết lập cửa hàng dữ liệu, nhưng đó là những gì cần phải làm. Bạn có thể tìm thấy toàn bộ bài viết của mình tại blog của Scott Hanselman: http://www.hanselman.com/blog/IntroducingSystemWebProvidersASPNETUniversalProvidersForSessionMembershipRolesAndUserProfileOnSQLCompactAndSQLAzure.aspx

0

Tôi nghĩ câu châm ngôn của "sử dụng đúng công cụ cho công việc", áp dụng ở đây. Tôi không thấy bất cứ điều gì sai trái với việc lưu trữ dữ liệu trong phiên miễn là nó được sử dụng đúng cách.

MVC cung cấp các cơ chế khác cho trạng thái ngắn hạn (ModelState và TempData). Nếu những người đó đáp ứng nhu cầu của bạn, hãy sử dụng chúng. TempData đang sử dụng SessionState phía sau hậu trường (như minh họa câu hỏi this). Nếu những gì bạn thực sự cần là dữ liệu duy trì trạng thái trong suốt thời gian của phiên người dùng và không còn, SessionSate là một công cụ tốt cho nhiệm vụ đó.

Sử dụng bộ nhớ đệm cũng tốt, nhưng bạn cần quản lý hết hạn/không hợp lệ bộ nhớ cache. Tôi tìm thấy bộ nhớ đệm hữu ích nhất cho những thứ không phải là phiên hoặc người dùng phụ thuộc, cho dù họ là ngắn hơn hoặc lâu hơn sống.