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