.NET 4.0中的自定义MembershipProvider

Eri*_*itz 40 asp.net asp.net-membership membership-provider

这里有一些关于这个问题的线索,但是大多数都已经过时了,其中的参考链接更加过时了.

我有这个网站,我需要连接到一个外部的SQL服务器(mssql)与它自己的表结构,使用默认的asp.net成员资格提供程序结构不是一个选项.表格布局非常简单,使用方式看起来像这样(它叫做个人)

Individuals
- UserGuid (uniqueidentifier/guid, unique)
- Name (varchar)
- Password (varchar)
- HasAccess (tinyint/ 1 or 0)
- DateTime (datetime)
- Log (xml)
Run Code Online (Sandbox Code Playgroud)

所需的功能只是记录某人,其余的没有必要:)

我遵循了一些指南,但其中大多数已经过时且非常复杂.不幸的是,msdn示例遵循这种模式,文档不是很好.

因此,如果有人得到一些资源显示如何或愿意发布代码示例或类似的东西,我会很感激.

谢谢!

bal*_*dre 62

它非常简单:

  1. 创建一个新的类文件(如果你没有使用多层系统,在你的项目的Models文件夹中)让我们调用 MyMembershipProvider.cs

  2. 继承该类 System.Web.Security.MembershipProvider

  3. 自动创建所需的方法(继承类中的句点+空格)

完成!

所有方法都有NotImplementedException例外,您需要做的就是编辑每个方法并放置自己的代码.例如,我定义GetUser如下所示:

public override MembershipUser GetUser(string username, bool userIsOnline)
{
    return db.GetUser(username);
}
Run Code Online (Sandbox Code Playgroud)

db是我作为数据库添加到我的数据库存储库

MyServicesRepository db = new MyServicesRepository();
Run Code Online (Sandbox Code Playgroud)

在那里,你会发现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);
}
Run Code Online (Sandbox Code Playgroud)

这样做对所有使用方法(调试项目,看看你需要哪些) -我只用了一些,不是所有的,因为我真的不关心类似的方法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>
Run Code Online (Sandbox Code Playgroud)

你有一个很好的视频教程来自Chris Pels(2007年,但仍然大部分有效)和代码,虽然视频教程在VB中,但让你理解这些步骤......

http://www.asp.net/general/videos/how-do-i-create-a-custom-membership-provider

我不仅创建了自己的会员提供者,而且还创建了我的角色提供者,从上面的代码可以看出,就像MemberShip一样简单,让你在你的应用程序中使用以下内容:

[Authorize(Roles = "Partner, Admin")]
public ActionResult MyAction()
{

}
Run Code Online (Sandbox Code Playgroud)

@if (Roles.IsUserInRole(Context.User.Identity.Name, "Admin"))
{
    <div>You're an ADMIN, Congrats!</div>
}
Run Code Online (Sandbox Code Playgroud)

什么是自动创建所需的方法(继承类中的句点+空间)

您可以右键单击,或将光标放在名称上,然后按Control+ .然后按space.

  • 顺便说一下,这需要引用System.Web.ApplicationServices.dll (3认同)