在ASP.NET Intranet MVC应用程序中维护经过身份验证的用户详细信息的最佳做法是什么



我正在开发Intranet.NET MVC应用程序。我需要存储与每个经过身份验证的用户相关的用户详细信息,如位置、ID号等。

在.NET Webform应用程序中,我们曾在会话中保存登录用户的详细信息。但是,.NET MVC应用程序中的最佳实践是什么呢?

您仍然可以在MVC中使用会话状态,但这是不可取的。MVC作为一种模式尊重HTTP的无状态性。

一种选择是使用只在内存中存储信息的Cache。下面是一个包含更多信息的SO问题:为什么ASP.NET MVC会使用会话状态?

这里还有一个问题:避免在ASP.NET MVC中使用会话状态是一个好的做法吗?如果是,为什么以及如何?

有几种方法可以剥这只猫的皮,但我认为将配置文件信息附加到用户身上是最优雅的。

您将需要一个配置文件提供程序来持久保存用户的配置文件数据。您可以使用SQL Server的SqlProfileProvider,但我建议您查看Microsoft ASP.NET通用提供程序参考:http://www.nuget.org/packages/Microsoft.AspNet.Providers

下面是斯科特·汉塞尔曼的一些无耻的复制粘贴。假设你想跟踪用户的生日:

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

然后你可以在web.config中设置它:

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

最后,您可以使用获取当前用户的自定义配置文件

var customProfile = HttpContext.Profile as MyCustomProfile;
DateTime? birthday = customProfile.Birthdate;

您必须设置您的数据存储,但这主要是需要做的。你可以在Scott Hanselman的博客中找到完整的细节:http://www.hanselman.com/blog/IntroducingSystemWebProvidersASPNETUniversalProvidersForSessionMembershipRolesAndUserProfileOnSQLCompactAndSQLAzure.aspx

我认为"为工作使用正确的工具"这句格言在这里适用。只要正确使用数据,我看不出在会话中存储数据有什么问题。

MVC为短期状态提供了其他机制(ModelState和TempData)。如果这些满足你的需求,就使用它们。TempData无论如何都在幕后使用SessionState(正如这个问题所示)。如果您真正需要的是数据在用户会话期间保持状态,而不再保持状态,那么SessionSate是执行该任务的好工具。

使用缓存也很好,但您需要管理缓存的过期/无效。我发现缓存对于那些不依赖会话或用户的东西最有用,无论它们的寿命是更短还是更长。

最新更新