在网站中,我需要整合会员资格和身份验证。所以我想使用ASP.NET Membership的功能,但我有其他自定义的东西,“用户”必须这样做。
所以我坐在这里用我的铅笔和纸,为我的领域模型画线......我怎样才能最好地利用ASP.Net会员资格,但是扩展它以满足我的需求?
我应该创建一个继承自MembershipUser的类,并使用我自己的属性和方法扩展它(并将其保存在单独的表中)。或者我应该让MembershipUser成为我的自定义用户/客户端对象的属性吗?
这样做有什么好办法?
答案 0 :(得分:11)
我已经考虑过了,并且有两种看似合适的方法(当然还有更多方法可以让它发挥作用)。
您更改会员提供者以使用您自己的会员提供者,并使用您的User对象存储所有信息。
这个问题是它涉及很多重新实现Asp.Net已经很好处理的事情。好消息是你有一个包含所有细节的User对象。
使用此方法,您可以使用原始成员资格提供程序来处理用户名和密码,但是您可以使用服务将自己的User对象与用户名称链接起来。
设置起来非常简单,只需要创建一个像这样使用的服务:
string userName = "Jon Skeet";
User user = new UserManagementServices().GetUserByUserName(userName);
答案 1 :(得分:7)
我最终编写了自己的会员提供商,现在已经在3个独立的解决方案中实现了这一点。它非常简单,比将用户链接到MembershipUser(我也尝试过)更加优雅。
阅读本文......:
Create Custom Membership Provider for ASP.NET Website Security
如果您想了解更多信息,请观看this video (with sourcecode)。
答案 2 :(得分:3)
我已经扩展了MembershipUser并创建了我自己的SqlMembershipProvider版本,以便映射到我现有的域,并且它现在正在生产中运行良好。
MembershipUser本质上是我的User表的视图。我的扩展MembershipUser类包括配置文件/帐户样式属性,而不是使用默认的SqlProfileProvider系统,这个系统有点脆弱。
我无法使用现有的会员表或sprocs,但写了我自己的。例如,SqlMembershipProvider使用GUID作为不透明键,但生产系统使用普通的旧int。所有日期也是UTC等。
所有额外的用户功能都可以通过用户域访问,而不是通过成员身份方法访问。
HTH。
答案 3 :(得分:0)
我目前正在阅读CoDe杂志的Microsoft ASP.NET 2.0 Membership API Extended文章,该文章解释了如何通过编写现有类的包装来扩展成员资格API。主要好处是您可以保留所有开箱即用的功能,而不必像实现自定义提供程序那样重写自己的功能。提供源代码。