membership成员资格是ASP.NET 成员资格为您提供了一种验证和存储用户凭据的内置方法。因此,ASP.NET 成员资格可帮助您管理网站中的用户身份验证。它包含以下功能

  • 创建新用户和密码。
  • 将成员资格信息(用户名、密码和支持数据)存储在 Microsoft SQL Server、Active Directory 或其他数据存储区。
  • 对访问站点的用户进行身份验证。可以以编程方式验证用户,也可以使用 ASP.NET 登录控件创建一个只需很少代码或无需代码的完整身份验证系统。
  • 管理密码,包括创建、更改和重置密码。根据您选择的成员资格选项不同,成员资格系统还可以提供一个使用用户提供的问题和答案的自动密码重置系统。
  • 公开经过身份验证的用户的唯一标识,您可以在您自己的应用程序中使用该标识,也可以将该标识与 ASP.NET 个性化设置和角色管理(授权)系统集成。
  • 指定自定义成员资格提供程序,这使您可以改为用自己的代码管理成员资格及在自定义数据存储区中维护成员资格数据

    它实际上是一个系统中用户管理的一部分(大致包含用户密码验证,用户的增删改查,但是用户的信息——即用户类的属性是固定的)。ASP.NET 成员资格由一组类和接口组成,这些类和接口可创建和管理用户,并基于用户提供的凭据来对用户进行身份验证。类的参考MSDN中《成员资格类》。

    下面则围绕membership的使用,对membershipProvider的扩展,对membershipUser的扩展这几方面来实践。

    Membership类的使用

    先介绍在web.config中的配置

    <membership
    
    <!--默认成员资格提供程序的名称-->
    
    defaultProvider="provider name"
    
    <!--指定用户帐户的上次活动日期时间戳之后的分钟数,在这段时间内,该用户被视为处于联机状态-->
    
    userIsOnlineTimeWindow="number of minutes"
    
    <!--指定用于对密码值进行哈希运算的加密算法的名称。默认SHA1,-->
    
    hashAlgorithmType="SHA1">
    
    <!--定义成员资格提供程序的集合。-->
    
    <providers>
    
    <!-- SqlMembershipProvider syntax -->
    
    <add name="string"
    
    type="string"
    
    connectionStringName="string"
    
    applicationName="MyApplication"
    
    commandTimeout
    
    description
    
    enablePasswordRetrieval="false"
    
    enablePasswordReset="true"
    
    requiresQuestionAndAnswer="true"
    
    requiresUniqueEmail="false"
    
    passwordFormat="Hashed"
    
    maxInvalidPasswordAttempts="5"
    
    passwordAttemptWindow="10"
    
    minRequiredPasswordLength
    
    minRequiredNonalphanumericCharacters
    
    passwordStrengthRegularExpression
    
    />
    
    <!-- ActiveDirectoryMembershipProvider syntax -->
    
    <add
    
    name="string"
    
    type="string"
    
    applicationName
    
    attributeMapUsername="string"
    
    attrbuteMapEmail="string"
    
    attributeMapPasswordQuestion="string"
    
    attributeMapPasswordAnswer="string"
    
    attributeMapFailedPasswordAnswerCount="number"
    
    attributeMapFailedPasswordAnswerTime="interval"
    
    attributeMapFailedPasswordAnswerLockoutTime="interval"
    
    clientSearchTimeout="interval"
    
    serverSearchTimeout
    
    connectionUsername="string"
    
    connectionPassword="string"
    
    connectionProtection="string"
    
    connectionStringName="connection string identifier"
    
    enablePasswordReset="true|false"
    
    enablePasswordRetrieval="true|false"
    
    enableSearchMethods="true|false"
    
    requiresQuestionAndAnswer="true|false"
    
    maxInvalidPasswordAttempts="number"
    
    passwordAttemptWindow="number"
    
    commandTimeout="number"
    
    description="string"
    
    passwordAnswerAttemptLockoutDuration="interval"
    
    minRequiredPasswordLength
    
    minRequiredNonalphanumericCharacters
    
    passwordStregnthRegularExpression="string"
    
    passwordAnswerAttemptLockoutDuration="number"
    
    requiresUniqueEmail="true|false"
    
    />
    
    </providers>
    
    </membership>

    在provider中,主要分ActiveDirectoryMembershipProvider 和SqlMembershipProvider 这两种Provider的配置特性有所差异,也列举在上面配置节中。

    Demo的Web.config配置如下

    <connectionStrings>
    
    <add name="SqlServices" connectionString="Data Source=.;Integrated Security=true;Initial Catalog=StudyASPNETDB" providerName="System.Data.SqlClient"/>
    
    </connectionStrings>
    
    <membership defaultProvider="sqlProvider" hashAlgorithmType="MD5" userIsOnlineTimeWindow="15" >
    
    <providers>
    
    <clear/>
    
    <add name="sqlProvider" type="System.Web.Security.SqlMembershipProvider"
    
    connectionStringName="SqlServices"
    
    passwordFormat="Hashed"
    
    applicationName="/" />
    
    </providers>
    
    </membership>

    贪方便我用了很久都没有弄过的WebForm,WebForm.aspx关键代码如下

    <form id="form1" runat="server">
    
    <div>
    
    ID: <input runat="server" name="userId" id="userId" type ="text" />
    
    <br />
    
    Password: <input runat="server" name="password" id="password" type="password" />
    
    <br />
    
    <asp:Label ID="res" runat="server" Text="" />
    
    <br />
    
    <asp:Button ID="login" Text="login" runat="server" OnClick="login_Click"/>
    
    <asp:Button ID="regist" Text="regist" runat="server" OnClick="regist_Click" />
    
    </div>
    
    </form>

    隐藏代码如下

    protected void login_Click(object sender, EventArgs e)
    
    {
    
    this.res.Text = Membership.ValidateUser(this.userId.Value, this.password.Value).ToString();
    
    }
    
    protected void regist_Click(object sender, EventArgs e)
    
    {
    
    Membership.CreateUser(this.userId.Value, this.password.Value,"123@qq.com");
    
    }

    有个注意点是添加用户,验证用户时传的密码都是密文,如果需要内部进行验证,则需把enablePasswordRetrieval设成Ture,但是也需要另外的配置,否则配置也会出错。并且密文的加密方式一定要与hashAlgorithmType的加密方式对应。另一个有疑惑的点是CreateUser(string username, string password)方法调用了会说缺了邮箱,看配置也看不出来有什么办法才能正常调用这个重载。

    先注册一个用户admin / 111(密文aY1RoZ2KEhzlgUmde3AWaA==),能看到表里面多了一条数据

    再用试一下认证的方法,文本框输入 admin 和 aY1RoZ2KEhzlgUmde3AWaA==,认证成功。

    另外一种提供Provider是需要活动目录(Activity Directory)的,现在对那方面了解不够,不好尝试。

    membershipProvider扩展

    创建自定义成员资格提供程序主要有两个原因。

    • 需要将成员资格信息存储在一个 .NET Framework 内附的成员资格提供程序不支持的数据源中,如 FoxPro 数据库、Oracle 数据库或其他数据源。
    • 需要使用不同于 .NET Framework 附带的提供程序所使用的数据库架构来管理成员资格信息。一个常见的示例是公司或网站的 SQL Server 数据库中已有的成员资格数据。

    MSDN上有一篇文章通篇展示了一个自定义的MembershipProvider,该MembershipProvider是以Access作为数据源的《如何:演示成员资格提供程序实现》,鄙人模仿也实现了一个MembershipProvider,需要重现的方法和属性比较多,如MSDN文章《实现成员资格提供程序》中所示。鄙人实现的并没有真正起到用户管理管理的作用,只是单纯的输出信息到文件中

    public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
    
    {
    
    status = MembershipCreateStatus.Success;
    
    System.IO.File.AppendAllText(@"E:\MemberShip.txt", "CreateUser\r\n");
    
    return GetUser(username, false);
    
    }
    
    public override MembershipUser GetUser(string username, bool userIsOnline)
    
    {
    
    System.IO.File.AppendAllText(@"E:\MemberShip.txt", "MembershipUser GetUser(string username, bool userIsOnline)\r\n");
    
    return new MembershipUser(this.Name,
    
    username,
    
    string.Empty,
    
    string.Empty,
    
    string.Empty,
    
    string.Empty,
    
    false,
    
    false,
    
    DateTime.Now,
    
    DateTime.Now,
    
    DateTime.Now,
    
    DateTime.Now,
    
    DateTime.Now);
    
    }
    
    public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
    
    {
    
    System.IO.File.AppendAllText(@"E:\MemberShip.txt", "MembershipUser GetUser(object providerUserKey, bool userIsOnline)\r\n");
    
    return new MembershipUser(this.Name,
    
    providerUserKey.ToString(),
    
    string.Empty,
    
    string.Empty,
    
    string.Empty,
    
    string.Empty,
    
    false,
    
    false,
    
    DateTime.Now,
    
    DateTime.Now,
    
    DateTime.Now,
    
    DateTime.Now,
    
    DateTime.Now);
    
    }
    
    public override bool ValidateUser(string username, string password)
    
    {
    
    System.IO.File.AppendAllText(@"E:\MemberShip.txt", "ValidateUser("+username+","+password+")\r\n");
    
    return username=="liuhf"&&password=="";
    
    }

    这里只展示了部分代码而已,Initialize方法则是粘贴了MSDN上的代码。Web.config配置修改如下

    <membership defaultProvider="sqlProvider" hashAlgorithmType="MD5" userIsOnlineTimeWindow="15" >
    
    <providers>
    
    <clear/>
    
    <add name="sqlProvider" type="FastDoge.Study.MyMembershipProvider2"/>
    
    </providers>
    
    </membership>

    WebForm的代码完全不用修改,运行效果如下

    输入用户名密码注册和登录,生成的txt文件内容如下

    看写死的代码则知道2222是登录失败的,上图是登录成功时的截图,密码111

    membershipUser扩展

    membershipUser扩展的作用在于想添加自定义的属性。如MSDN上的示例一样,

    publicclass OdbcMembershipUser : MembershipUser
    {
    privatebool _IsSubscriber;
    privatestring _CustomerID; publicbool IsSubscriber
    {
    get { return _IsSubscriber; }
    set { _IsSubscriber = value; }
    } publicstring CustomerID
    {
    get { return _CustomerID; }
    set { _CustomerID = value; }
    } public OdbcMembershipUser(string providername,
    string username,
    object providerUserKey,
    string email,
    string passwordQuestion,
    string comment,
    bool isApproved,
    bool isLockedOut,
    DateTime creationDate,
    DateTime lastLoginDate,
    DateTime lastActivityDate,
    DateTime lastPasswordChangedDate,
    DateTime lastLockedOutDate,
    bool isSubscriber,
    string customerID) :
    base(providername,
    username,
    providerUserKey,
    email,
    passwordQuestion,
    comment,
    isApproved,
    isLockedOut,
    creationDate,
    lastLoginDate,
    lastActivityDate,
    lastPasswordChangedDate,
    lastLockedOutDate)
    {
    this.IsSubscriber = isSubscriber;
    this.CustomerID = customerID;
    } }

    如果想用自己的MembershipUser,必须使用自定义的MembershipProvider才能用上自定义的MembershipUser,对新增加的属性需要存储起来的,那么MembershipProvider中对应的增(MembershipProvider.CreateUser),查(MembershipProvider.GetUser),改(MembershipProvider.UpdateUser)方法也需要修改(用于对新增属性的处理,例如上面的IsSubscriber和CustomerID)。代码还是偷懒不粘贴了,参考MSDN文章《如何:实现自定义成员资格用户

membership与成员资格的更多相关文章

  1. 使用成员资格管理用户Membership

    ASP.NET成员资格使您可以验证和管理Web应用程序的用户信息.它提供验证用户凭据,创建和修改成员资格用户以及管理用户设置(如密码和电子邮件地址)的功能. ASP.NET成员资格主要用于ASP.NE ...

  2. [转]ASP.NET 成员资格 Part.1(API)

    本文转自:http://www.cnblogs.com/SkySoot/archive/2013/04/08/3008418.html 表单验证解决了 ASP.NET 应用程序页面验证的问题,但另一方 ...

  3. MVC4 成员资格、 身份验证

    SimpleMembership,成员资格提供程序. 通用的提供者和新的 ASP.NET 4.5 Web 窗体和 ASP.NET MVC 4 模板 ASP.NET MVC 4 互联网模板中添加一些新的 ...

  4. ASP.NET 成员资格 Part.2(使用安全控件 Login)

    原文:ASP.NET 成员资格 Part.2(使用安全控件 Login)        准备好提供程序以及用户信息的存储,就可以开始构建验证用户.注册用户或者让用户能够重置密码的用户界面了.ASP.N ...

  5. ASP.NET成员资格和角色管理

    一.成员资格管理 1.成员资格管理模型 ASP.NET提供的成员资格管理功能,其核心是利用内置的成员库表(SQL Server).成员资格管理API(Membership.MembershipUser ...

  6. SimpleMembership,成员资格提供程序、 通用的提供者和新的 ASP.NET 4.5 Web 窗体和 ASP.NET MVC 4 模板

    ASP.NET MVC 4 互联网模板中添加一些新的. 非常有用的功能,构建 SimpleMembership.这些更改将添加一些很有特色,像很多更简单. 可扩展会员 API 和 OAuth 的支持. ...

  7. ASP.Net MVC 5 高级编程 第7章 成员资格、授权和安全性

    第7章 成员资格.授权和安全性 7.1 安全性 ASP.NET MVC 提供了许多内置的保护机制(默认利用 HTML 辅助方法和Razor 语法进行 HTML编码以及请求验证等功能特性,以及通过基架构 ...

  8. in成员资格符

    #in成员资格符 name='小树' '小'in name# 返回True '大树'in name#返回False

  9. pandas(四)唯一值、值计数以及成员资格

    针对Series对象,从中抽取信息 unique可以得到Series对象的唯一值数组 >>> obj = Series(['c','a','d','a','a','b','b','c ...

随机推荐

  1. CMS模板引擎:XHtmlAction

    前言: 先说说大伙关心的工作上的事,在上家公司任了一个多月的技术经理后,和公司中止了合作关系. 主要原因在于一开始的待遇没谈的太清楚: 1:没有合同,没有公积金,连社保也没交. 2:工资的30%变成了 ...

  2. io.js入门(一)—— 初识io.js

    io.js可以说是彻底从NodeJS里分离出来的一条分支,其事情始末可以查看这篇报道,此处便也不赘言.既然是分支,io.js便也基本兼容NodeJS的各种API,连执行指令也依旧兼容Node的 nod ...

  3. mysql字符串处理例子

    项目中用到的,要判断表中某个字段的某几位,若为某个值则替换,用到了几个典型的字符串操作,记录备注实现方案如下: 备注:如果替代字符串是唯一的话,可以用replace,这里用的是concat拼接. DE ...

  4. [ASP.NET MVC 小牛之路]17 - 捆绑(Bundle)

    本文介绍 MVC 4 提供的一个新特性:捆绑(Bundle),一个在  View 和 Layout 中用于组织优化浏览器请求的 CSS 和 JavaScript 文件的技术. 本文目录 了解VS默认加 ...

  5. 使用变量 数据类型转换 逻辑控制语句(begin ...end; case...end; if...else; while)

    一:变量 变量分为局部变量和全局变量  (全局变量是系统自定的,是不可手动给值的,若想自己定义全局变量可考虑创建全局临时表!) 局部变量的定义:  declare @变量名  数据类型 (局部变量只能 ...

  6. 防止SQL注入攻击

    了解了SQL注入的方法,如何能防止SQL注入?如何进一步防范SQL注入的泛滥?通过一些合理的操作和配置来降低SQL注入的危险. 使用参数化的过滤性语句 要防御SQL注入,用户的输入就绝对不能直接被嵌入 ...

  7. iOS瀑布流实现(Swift)

    这段时间突然想到一个很久之前用到的知识-瀑布流,本来想用一个简单的方法,发现自己走入了歧途,最终只能狠下心来重写UICollectionViewFlowLayout.下面我将用两种方法实现瀑布流,以及 ...

  8. SQL Server中使用Check约束提升性能

        在SQL Server中,SQL语句的执行是依赖查询优化器生成的执行计划,而执行计划的好坏直接关乎执行性能.     在查询优化器生成执行计划过程中,需要参考元数据来尽可能生成高效的执行计划, ...

  9. 模板引擎Nvelocity实例

    前言 最近一直忙于工作,没时间来管理博客,同时电脑也不给力,坏了一阵又一阵,最后还是去给修理了,这不刚一回来迫不及待的就写一篇文章来满足两个月未写博客的紧迫感. Nvelocity 关于nveloci ...

  10. ASP.NET 5 单元测试中使用依赖注入

    相关博文:<ASP.NET 5 使用 TestServer 进行单元测试> 在上一篇博文中,主要说的是,使用 TestServer 对 ASP.NET 5 WebApi 进行单元测试,依赖 ...