.NET 4.0 中的自定义 MembershipProvider
Posted
技术标签:
【中文标题】.NET 4.0 中的自定义 MembershipProvider【英文标题】:Custom MembershipProvider in .NET 4.0 【发布时间】:2011-08-07 18:49:00 【问题描述】:这里有一些关于这个问题的帖子,但其中大多数已经过时,其中的参考链接更加过时。
我得到了这个网站,我需要使用它自己的表结构连接到外部 sql 服务器 (mssql),不能使用默认的 asp.net 会员提供程序结构。表格布局真的很简单,usertable看起来像这样(它被称为Individuals)
Individuals
- UserGuid (uniqueidentifier/guid, unique)
- Name (varchar)
- Password (varchar)
- HasAccess (tinyint/ 1 or 0)
- DateTime (datetime)
- Log (xml)
所需的功能只是让某人登录,其余的不是必需的:)
我遵循了一些指南,但其中大多数都已过时且非常复杂。不幸的是,msdn 示例遵循这种模式并且文档不是很好。
因此,如果有人获得一些资源来展示如何操作,或者愿意在此处发布代码示例或类似内容,我将不胜感激。
谢谢!
【问题讨论】:
我已经多次搜索过简单的提供者。并且总是发现一些过于复杂的东西。所以我决定创建自己的 5 个类。见github.com/TesserisPro/ASP.NET-SImple-Security-Provider 【参考方案1】:其实很简单:
创建一个新的 Class 文件(如果您不使用多层系统,请在项目的 Models 文件夹中)让我们调用 MyMembershipProvider.cs
从System.Web.Security.MembershipProvider
继承该类
自动创建需要的方法(继承类中句号+空格)
完成!
所有方法都会有NotImplementedException
异常,您需要做的就是编辑每个方法并输入您自己的代码。比如我定义GetUser
如下图:
public override MembershipUser GetUser(string username, bool userIsOnline)
return db.GetUser(username);
db
是我添加到类中的数据库存储库
MyServicesRepository db = new MyServicesRepository();
在那里,您会发现GetUser
方法为:
public MembershipUser GetUser(string username)
OS_Users user = this.FindUserByUsername(username);
if (user == null)
return
new MembershipUser(
providerName: "MyMembershipProvider",
name: "",
providerUserKey: null,
email: "",
passwordQuestion: "",
comment: "",
isApproved: false,
isLockedOut: true,
creationDate: DateTime.UtcNow,
lastLoginDate: DateTime.UtcNow,
lastActivityDate: DateTime.UtcNow,
lastPasswordChangedDate: DateTime.UtcNow,
lastLockoutDate: DateTime.UtcNow);
return
new MembershipUser(
providerName: "MyMembershipProvider",
name: user.username,
providerUserKey: null,
email: user.email,
passwordQuestion: "",
comment: "ANYTHING you would like to pass",
isApproved: true,
isLockedOut: user.lockout,
creationDate: user.create_date,
lastLoginDate: user.lastLoginDate,
lastActivityDate: user.lastActivityDate,
lastPasswordChangedDate: user.lastPasswordChangedDate,
lastLockoutDate: user.lastLockoutDate);
为您使用的所有方法执行此操作(调试项目并查看您需要哪些方法)- 我只使用一些,而不是全部,因为我并不真正关心 ChangePasswordQuestionAndAnswer
、DeleteUser
等方法
只需确保在您的 web.config
中添加新的会员资格:
<membership defaultProvider="MyMembershipProvider">
<providers>
<clear/>
<add name="MyMembershipProvider" type="Your.NameSpace.MyMembershipProvider" connectionStringName="OnlineServicesEntities"
enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
applicationName="/" />
</providers>
</membership>
您有一个很好的 视频教程 来自 Chris Pels(日期为 2007 年,但仍然大部分有效)和代码也用于此,虽然视频教程是在 VB 中,但让我们了解这些步骤...
http://www.asp.net/general/videos/how-do-i-create-a-custom-membership-provider
我不仅创建了自己的 Membership Provider,而且 我还创建了 Roles Provider,正如您从上面的代码中看到的那样,就像 MemberShip 一样简单,让您在您的应用程序中使用类似的东西:
[Authorize(Roles = "Partner, Admin")]
public ActionResult MyAction()
和
@if (Roles.IsUserInRole(Context.User.Identity.Name, "Admin"))
<div>You're an ADMIN, Congrats!</div>
什么是自动创建所需的方法(继承类中的句点+空格)
您可以右键单击,或者将光标放在名称上,然后按 Control + .,然后按 space。
【讨论】:
谢谢,我还需要将 aspnet 模式(会员提供者使用的模式)和其他东西安装到我的远程数据库吗? 不...该类与数据库模式没有连接,您可以实现它。例如,在我的示例中,我请求了我自己的数据库/我自己的表OS_Users
给我用户,只要您传递MembershipUser
就可以了。 --> 请参阅我首先在答案中发布的截屏视频,这样您就知道这是怎么一回事了。
@Michael 晚了几个月,但由于我昨天自己才弄清楚这一点,所以我想分享一下:您可以“自动”创建必须通过右键单击“继承的方法和属性” MembershipProvider”在你的类标题(公共类 MyMembershipProvider:MembershipProvider)--- 将有一个选项来为必要的继承的东西生成存根。所有存根都会自动填充 NotImplementedExceptions(),您可以保留这种方式,也可以在必要时删除并实现。
您可以将光标放在名称上,然后按Control
+ .
,然后按space
,而不是右键单击。
顺便说一句,这需要引用 System.Web.ApplicationServices.dll【参考方案2】:
这里有几个线程 关于这件事,但他们中的大多数是 过时的和参考链接 它们甚至更过时了。
自从在 Framework 1.0 中引入 ASP.NET 以来,Page.User/CurrentSession.User/IPrincipal/IIdentity 模型没有改变。在 Framework 2.0 中,添加了成员资格提供程序。那些“过时”的参考仍然是有效的指导。 MSDN
【讨论】:
以上是关于.NET 4.0 中的自定义 MembershipProvider的主要内容,如果未能解决你的问题,请参考以下文章
使用 .Net Membership / Roles 支持自定义授权/访问规则
如何不使用 ASP.Net Membership Security Question and Answer 进行自定义密码恢复?