.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);

为您使用的所有方法执行此操作(调试项目并查看您需要哪些方法)- 我只使用一些,而不是全部,因为我并不真正关心 ChangePasswordQuestionAndAnswerDeleteUser 等方法

只需确保在您的 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 进行自定义密码恢复?

ASP.net Membership角色与权限管理

Membership 介绍

membership与成员资格

使用框架 4.0 的 ASP.NET 中的主题