如何在我的领域模型中实现ASP.NET会员资格提供程序

20
在一个网站中,我需要集成会员和身份验证功能。因此,我想使用ASP.NET Membership的功能,但我有其他自定义需求,即“用户”必须执行的任务。
因此,我现在手握铅笔和纸张,在画出我的领域模型…… 我如何最好地利用ASP.Net Membership,但又满足我的需求呢?
我应该创建一个继承自MembershipUser的类,并以自己的属性和方法进行扩展(并将其保存在单独的表中)?还是应该让MembershipUser成为我的自定义用户/客户对象的属性?
什么是一个好的稳定的实现方式?
4个回答

11

我已经考虑过了,有两种方法似乎很合适(当然还有其他使其工作的方法)。

自定义成员提供程序

您可以更改成员提供程序以使用自己的User对象存储所有信息。

这种方法的问题在于它需要重新实现一些由Asp.Net已经处理得很好的东西。好处是您只有一个包含所有详细信息的User对象。

从Membership User链接到您的User

通过此方法,您将使用原始的Membership提供程序处理用户名和密码,但您可以使用类似于服务的方式将自己的User对象与其链接,例如通过用户名。

设置非常简单,您只需要创建一个类似于以下用法的服务即可:

string userName = "Jon Skeet";
User user = new UserManagementServices().GetUserByUserName(userName);

你最终采用了哪种方法?还有,当有人更改他们的用户名/电子邮件时,你如何处理这种情况?目前这是我实施中最大的漏洞之一。 - Simon_Weaver
我更喜欢第二个选项,尽管我都没怎么使用过。在我看来,用户名/电子邮件不应该作为用户标识符,而是每个用户都应该有一个标识符(数字或GUID),而用户名/电子邮件应该是唯一的。 - mbillard

7

您介意评论一下这样做对您所失去的东西的影响吗?您会失去任何cookie跟踪功能或管理控制台集成吗?不是说管理控制台特别好,但至少它是些什么。 - Simon_Weaver
我失去了管理员控制台,但我从未使用过它。当然,我也失去了aspnet成员资格提供程序的所有功能(更改密码、存储等)。但是,我再也不会在我关心的任何项目中实现aspnet成员资格提供程序。我不知道你所说的“失去cookie跟踪功能”的意思。我没有意识到自己失去了这样的东西。 ;) - Kjensen

3
我扩展了MembershipUser并创建了自己的SqlMembershipProvider版本,以映射到我现有的领域,并且现在已经在生产中运行良好。
MembershipUser本质上是我的用户表上的视图。我的扩展MembershipUser类包括配置文件/帐户风格的属性,而不是使用默认的SqlProfileProvider系统,这有点脆弱。
我无法使用现有的会员资格表或存储过程,但编写了自己的。例如,SqlMembershipProvider使用GUID作为不透明密钥,但生产系统使用普通的int。所有日期也都是UTC。
所有额外的用户功能都是通过用户领域访问而不是通过Membership方法访问。
希望对你有所帮助。

0

我目前正在学习 CoDe Magazine 的 Microsoft ASP.NET 2.0 Membership API Extended 文章,该文章介绍如何编写包装器来扩展会员 API。主要优点是可以保留所有开箱即用的功能,无需像实现自定义提供程序时那样重写自己的代码。源代码已提供。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接