我刚刚开始学习ASP.NET MVC。我正在使用标准项目模板创建的项目,默认情况下使用SqlMembershipProvider
。这已在我的项目中自动创建了一个ASPNETDB.mdf数据库来保存成员资格信息。如何将存储在此数据库中的成员与我的实际应用程序数据相关联?
我是否应该使用this.User.Identity.Name
在我的操作方法中引用当前用户的名称,以便在我的应用程序数据库中存储或检索用户特定信息时用作密钥?或者我应该使用this.User.Identity.UserId
代替?我一直认为基于整数的ID与字符串或GUID基本ID相比要快得多。但aspnet_Users表的主键是GUID字段。
this.user
与this.HttpContext.User
之间有什么区别吗?从这些属性返回的IPrincipal
与从MembershipUser
返回的Membership.GetUser()
相比如何?这些有什么区别?
此外,最好将成员资格信息保存在与应用程序数据库不同的数据库中吗?或者可以将它们合并到一个数据库中吗?
答案 0 :(得分:1)
默认模板应该在Models文件夹中为您提供“AccountModel”,它为某些formsauthentication / membership函数创建包装器。你可以扩展它并添加一个函数来返回当前HttpContext中存储的IPrincipal的当前“HttpContext.Current.User”。使用Name属性,您可以通过用户名查询Membership以获取Membership数据(IPrincipal只存储用户名,角色等基础知识,MembershipUser会从db中提取所有其他数据)。
SqlMembershipProvider是非常糟糕的imo并且限制除了小项目之外......同时也是复杂的。我现在在拥有2000多个帐户的网站上使用它,如果你想定制任何东西,那就是皮塔饼。最好(并且网上有很多例子)只是编写自己的使用formsauthentication并摆脱Membership垃圾。我现在有一个,我希望我开始写一个。
答案 1 :(得分:1)
您的问题有几个要素,有几点:
我通常使用身份名称,因为它通常使用效率更高。 get user function从数据库获取完整的用户数据并更新上次访问时间。 IPrinciple不需要这个并且在内存数据中使用。因此,用户名属性更快,更容易获得。主要的警告是,如果您可能允许用户更改其用户名,在这种情况下,ID会更有意义。
听起来你正在考虑拥有大量与用户相关的记录。你是对的,整数是最快的查找。如果您有大量数据,那么您可能希望通过extending the membership提供程序或添加映射表将用户映射到整数。
至于this.User vs HttpContext.User,没什么区别。
答案 2 :(得分:0)
在我使用SqlMembershipProvider的应用程序中,我通常将其表/ sprocs存储在与我的应用程序表相同的DB中,然后使用外键将我的app表链接到用户表。有一次我没有这样做是因为一个用户数据库将在多个不同的应用程序之间共享,每个应用程序都有自己的应用程序数据库。