65.9K
CodeProject 正在变化。 阅读更多。
Home

创建自定义 membership provider

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2013 年 10 月 11 日

CPOL

2分钟阅读

viewsIcon

7695

在使用需要某种用户身份验证的 ASP.NET 网站时(我敢说几乎每次都需要),我们通常需要建立自己的

在使用需要某种用户身份验证的 ASP.NET 网站时(我敢说几乎每次都需要),我们通常需要建立自己的逻辑,并使用我们自己的数据库,而不是 ASP.NET 提供的数据库(使用我们自己的数据模型或东西)。

基本上,您想创建一个自定义成员资格提供程序类有两个原因

  • 您希望将您的成员资格信息存储在与 ASP.NET 提供的数据库不同的数据库中(这是一个 SQL Server Express 数据库),例如 Oracle 或 MySQL 数据库或 Web 服务。
  • 您希望将您的成员资格信息存储在 SQL Server 数据库中,该数据库的模式(数据模型)与 System.Web.Security.SqlMembershipProvider 类使用的默认模式不同。例如,如果我们的公司已经拥有一个所有应用程序共享的成员资格 SQL Server 数据库。 

鉴于此,您很可能需要创建自己的成员资格类,这里是创建它的 **一种** 方法

首先,实现一个继承自抽象类 System.Web.Security.MemershipProvider 的类。这个类也继承自另一个抽象类,System.Configuration.Provider.ProviderBase,所以我们也应该实现这些方法。基本上,需要创建的是一个具有以下定义的类

public class MyProvider : MembershipProvider

之后,我们需要初始化(实现)基类使用的类变量,将每个变量设置为我们的业务逻辑所需的值

//最小密码长度
private int minRequiredPasswordLength = 6;
//最少需要的非字母数字字符
private int minRequiredNonAlphanumericCharacters = 0;
//启用 - 禁用密码检索
private bool enablePasswordRetrieval = true;
//启用 - 禁用密码重置
private bool enablePasswordReset = false;
//需要安全问题和答案(例如,这是一个很少有人使用的功能)
private bool requiresQuestionAndAnswer = true;
//应用程序名称
private string applicationName = "MYAPP";
//帐户被阻止之前的最大密码尝试失败次数,以及重置该计数器的时间
private int maxInvalidPasswordAttempts = 3;
private int passwordAttemptWindow = 10;
//需要电子邮件唯一
private bool requiresUniqueEmail = true;
//密码格式
private MembershipPasswordFormat passwordFormat = new MembershipPasswordFormat();
//密码应匹配的正则表达式(为空则无)
private string passwordStrengthRegularExpression = String.Empty;

接下来,使用您自己的自定义逻辑实现所有您需要的方法

public override bool ValidateUser(string username, string password)
{
//对于我们的示例,如果用户名和密码相同,则用户将被身份验证
return username == password;
}

如果万一您决定不实现任何基类方法(也不使用基逻辑),只需抛出一个新的 NotImplemetedException


public override string GetUserNameByEmail(string email)
{
throw new NotImplementedException();
}

最后一步是修改我们的 Web.config 文件

<configuration>
<system.web>
...
...
...
...
<membership defaultprovider="MyProvider">
<providers>
<add type="MyProvider" name="MyProvider">
</providers>
</membership>
</system.web>
</configuration>

这显然是一种需要时间和工作量的替代方案,但如果实现得当,绝对值得。

© . All rights reserved.