Membership学习(二)

2024-03-06 12:48
文章标签 学习 membership

本文主要是介绍Membership学习(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

         Membership Providers提供了Membership数据源和服务之间的所有接口,在Asp.net2.0中提供了两个Provider:SqlMembershipProvider和ActiveDirectoryMembershipProvider,从命名中我们也可以看出,SqlMembershipProvider是把 sql server和sql server express数据库作为数据库源,而ActiveDirectoryMembershipProvider是有Microsoft Active Directory(活动目录)作为数据源的。
          Membership Providers的基本工作是用来管理一个网站注册用的数据,并且提供一些函数用来做 创建,删除用户,验证用户登录信息,修改密码等工作。在.net 框架的System.Web.Security命名空间下有一个MembershipUser的类,这个类定义了Membership 用户的一些基本属性,Membership Provider用这个类来描绘每个用户信息。Membership Providers 有一个基础类 他的定义如下:(丛msdn里copy出来的)

 

public abstract class MembershipProvider : ProviderBase
{
      // Abstract properties
      public abstract bool EnablePasswordRetrieval { get; }
      public abstract bool EnablePasswordReset { get; }
      public abstract bool RequiresQuestionAndAnswer { get; }
      public abstract string ApplicationName { get; set; }
      public abstract int MaxInvalidPasswordAttempts { get; }
      public abstract int PasswordAttemptWindow { get; }
      public abstract bool RequiresUniqueEmail { get; }
      public abstract MembershipPasswordFormat PasswordFormat { get; }
      public abstract int MinRequiredPasswordLength { get; }
      public abstract int MinRequiredNonAlphanumericCharacters { get; }
      public abstract string PasswordStrengthRegularExpression { get; }
      // Abstract methods
      public abstract MembershipUser CreateUser (string username,
          string password, string email, string passwordQuestion,
          string passwordAnswer, bool isApproved, object providerUserKey,
          out MembershipCreateStatus status);
      public abstract bool ChangePasswordQuestionAndAnswer
          (string username, string password,
          string newPasswordQuestion, string newPasswordAnswer);
      public abstract string GetPassword (string username,
        string answer);
      public abstract bool ChangePassword (string username,
          string oldPassword, string newPassword);
      public abstract string ResetPassword (string username,
          string answer);

      public abstract void UpdateUser (MembershipUser user);
      public abstract bool ValidateUser (string username,
          string password);
      public abstract bool UnlockUser (string userName);
      public abstract MembershipUser GetUser (object providerUserKey,
          bool userIsOnline);
      public abstract MembershipUser GetUser (string username,
          bool userIsOnline);
      public abstract string GetUserNameByEmail (string email);
      public abstract bool DeleteUser (string username,
          bool deleteAllRelatedData);
      public abstract MembershipUserCollection GetAllUsers
          (int pageIndex, int pageSize, out int totalRecords);
      public abstract int GetNumberOfUsersOnline ();
      public abstract MembershipUserCollection FindUsersByName
          (string usernameToMatch, int pageIndex, int pageSize,
          out int totalRecords);
      public abstract MembershipUserCollection FindUsersByEmail
          (string emailToMatch, int pageIndex, int pageSize,
          out int totalRecords);
      // Virtual methods
      protected virtual byte[] EncryptPassword (byte[] password);
      protected virtual byte[] DecryptPassword (byte[] encodedPassword);
      protected virtual void OnValidatingPassword
          (ValidatePasswordEventArgs e);
      // Events
      public event MembershipValidatePasswordEventHandler
          ValidatingPassword;
}

SqlMembershipProvider类就是从这个类里继承下来的。

接下来 我们使用SqlMembershipProvider类作为例子来进行比较细致的说明。

SqlMembershipProvider:

SqlMembershipProvider是给Membership使用sql server数据库做的Provider,它使用数据库的存储过程来实现对数据的操作,这样SqlMembershipProvider可以经过很少的改动来 实现对其他数据库的支持。

1.Provider 初始化

    Provider初始化是在 SqlMembershipProvider.Initialize,它只运行一次,是在asp.net装载Provider时。

    a.初始化SqlMembershipProvider的各种属性 比如:EnablePasswordRetrieval 和 EnablePasswordReset,从相应的配置文件的配置属性中读入。

    b.对一些公共属性的值进行检查,当有错误的时候抛出异常,比如PasswordFormat值是”hashed”,而EnablePasswordRetrieval的值是true,就会有异常抛出。

   c.在配置里存在一些不被承认的属性时,也会抛出异常

    SqlMembershipProvider.Initialize还会从<connectionStrings>中读取数据库连接字符串,保存到一个私有的变量中,如果不能读到或者读取的连接字符串是错误的,也会抛出一个异常。

2.数据定义

    SqlMembershipProvider的Membership数据保存在数据库的aspnet_Membership表中

aspnet_Membership 定义(msdn中取出)

 

字段名

字段类型

表述

ApplicationId

uniqueidentifier

Application ID,应用程序id

UserId

uniqueidentifier

User ID,用户id

Password

nvarchar(128)

密码,可以是加密 hash保存的

PasswordFormat

 

int

 

Password format (0=Plaintext, 1=Hashed, 2=Encrypted)

PasswordSalt

 

nvarchar(128)

 

Randomly generated 128-bit value used to salt password hashes; stored in base-64-encoded form

MobilePIN

nvarchar(16)

User's mobile PIN (当前没有使用)

Email

nvarchar(256)

email

LoweredEmail

nvarchar(256)

小写email地址

PasswordQuestion

nvarchar(256)

密码问题

PasswordAnswer

nvarchar(128)         

密码问题答案

IsApproved

bit

1=Approved, 0=Not approved

IsLockedOut

bit

1=Locked out, 0=Not locked out

CreateDate

datetime

创建时间

LastLoginDate

datetime

最后登录时间

LastPasswordChangedDate

datetime

密码最后修改时间

LastLockoutDate

datetime

最后登出的时间

FailedPasswordAttemptCount

int

联系登录失败次数

FailedPasswordAttempt-WindowStart

datetime

FailedPasswordAttemptCount非零时,第一次登录失败的时间

FailedPasswordAnswer-AttemptCount

int

回答密码问题联系失败的次数

FailedPasswordAnswer-AttemptWindowStart

datetime

FailedPasswordAnswer-AttemptCount非零时,第一次回答问题失败的时间

Comment

ntext

扩展的文本

 

这个表中的每一条记录代表一个用户,这个表还有两个外键,分别关联aspnet_Applications表和aspnet_Users表

aspnet_Applications表

字段名

字段类型

描述

ApplicationId

uniqueidentifier

Application ID

ApplicationName

nvarchar(256)

Application name

LoweredApplicationName

nvarchar(256)

Application name (小写)

Description

nvarchar(256)

Application 描述

 

aspnet_Users 表

字段名

字段类型

描述

ApplicationId

uniqueidentifier

Application ID

UserId

uniqueidentifier

用户ID

UserName

nvarchar(256)

用户名

LoweredUserName

nvarchar(256)

用户名 (小写)

MobileAlias

 

nvarchar(16)

 

User's mobile alias (currently not used) 没有使用

IsAnonymous

 

bit

 

1=Anonymous user, 0=Not an anonymous user

LastActivityDate

datetime

用户最后一次活动时间


 

一条完整的记录 aspnet_Membership和aspnet_Users都要存在。

3.数据访问

SqlMembershipProvider是通过存储过程完成所有的数据库操作的,简单介绍一下这些存储过程

SqlMembershipProvider存储过程

名称

描述

aspnet_Membership_ChangePassword-QuestionAndAnswer

修改密码,密码问题,密码问题答案

aspnet_Membership_CreateUser

增加一个membership用户 记录同时写入aspnet_Users aspnet_Membership , 如果需要,还要增加一条记录到aspnet_Applications表。

aspnet_Membership_FindUsersByEmail

通过email地址匹配查找用户的记录,同时还要一个application ID.

aspnet_Membership_FindUsersByName

通过用户名匹配查找用户的记录,同时还要一个application ID.

aspnet_Membership_GetAllUsers

得到所有用户记录,在一个下application ID.

aspnet_Membership_GetNumberOfUsersOnline

得到在线用户数 (通过用户最后活动时间字段(LastActivityDate)实现)

aspnet_Membership_GetPassword

得到一个用户的密码,通过密码问题的回答

aspnet_Membership_GetPasswordWithFormat

得到一个用户的密码。通过密码比较重新取得密码。

aspnet_Membership_GetUserByEmail

使用emailapplication idaspnet_Membership中得到相应的记录

aspnet_Membership_GetUserByName

使用用户名和application idaspnet_Membership中得到相应的记录

aspnet_Membership_GetUserByUserId

使用useridapplication idaspnet_Membership中得到相应的记录

aspnet_Membership_ResetPassword

重置用户密码通过回答密码问题

aspnet_Membership_SetPassword

设置一个密码

aspnet_Membership_UnlockUser

恢复用户登录的权限通过将IsLockedOut字段设置成0

aspnet_Membership_UpdateUser

 

更新用户的aspnet_users表的LastActivityDate,e-mail,注释,approved字段和aspnet_Membership表的最后登录时间。

aspnet_Membership_UpdateUserInfo

 

更新帐户锁定时间在aspnet_usersaspnet_Membership表,Used in conjunction with provider methods that track bad password and bad password-answer attempts.

aspnet_Users_CreateUser

调用aspnet_Membership_CreateUser增加一个到用户到aspnet_users表。

aspnet_Users_DeleteUser

 

删除一个用户 aspnet_membership已经一些关联表里包括aspnet_users.

 

4.创建用户

SqlMembershipProvider.CreateUser通过调用aspnet_Membership_CreateUser储存过程创建membership用户。SqlMembershipProvider.CreateUser在调用存储过程之前还会对用户的输入参数做一些校验,包括密码等。

创建用户的流程

a.                 调用aspnet_Applications_CreateApplication,存储过程,转换一个ApplicationName成Application ID.如果在aspnet_Applications表中已经存在这个Application ID就返回存在Application ID,如果表中不存在,在aspnet_Applications表中新增加一条记录并返回这个Application ID.

b.                 调用aspnet_Users_CreateUser在aspnet_Users表中添加一条新记录

c.                 做一个验证对email地址和原来已经注册的用户。

d.                 使用当前的时间来更新一下aspnet_Users表的LastActityDate字段。

e.                 插入一条新记录到aspnet_Membership表。

aspnet_Membership_CreateUser提供了所有的这些步骤,并使用事务来保证数据库更新的完整性。

5.删除用户

程序通过调用Membership.DeleteUser来实现删除membership用户的功能。

Membership.DeleteUser调用默认的membership提供者的DeleteUser的函数,而这个函数有两个输入值,一个是用户名 另外一个参数(deleteAllRelatedData)是bool值,这个bool值表示是否要删除这个用户的一些关联信息,包括role data, profile data和 Web Parts personalization data。

DeleteUser还可以实现一个其他的功能就是 把用户名输入Request.AnonymousID,而参数deleteAllRelatedData设置为true,这样可以删除匿名用户在数据库的aspnet_Profile和aspnet_Users表中保存的记录。

6.验证membership用户

程序通用调用Membership.ValidateUser来实现用户的验证,返回值是一个bool值,包括用户名密码是否正确。

验证的流程

a.                通过调用存储过程 aspnet_Membership_GetPasswordWithFormat得到用户的密码,如果是加密的返回的是加密的字串。

b.                使用相同的加密码方法加密输入的密码。

c.                比较两个密码。

d.                如果密码匹配 会触发一个AuditMembershipAuthenticationSuccess的Web 事件,同时记录一个成功登陆的纪录,并返回true

e.                如果密码不匹配,会触发一个 AuditMembershipAuthenticationFailure的web 事件,返回false,同时还会调用aspnet_Membership_UpdateUserInfo储存过程做记录,如果记录发现已经达到限制用户登录的条件,还会锁住此用户。

7.密码保护

为了安全,密码保存在数据库中一般不用明文,SqlMembershipProvider提供了几种不同保存密码的方法,我们可以通过设置PasswordFormat属性来指定不同的保存方法。

a.      MembershipPasswordFormat.Clear使用明文保存

b.      MembershipPasswordFormat.Hashed 默认参数,会使用.Net框架的RNGCryptoServiceProvider类来对密码和密码问题进行Hash计算保存。

c.      MembershipPasswordFormat.Encrypted对密码和密码问题进行加密。SqlMembershipProvider使用的是对称密钥加密方法。加密的密钥保存在<machineKey>配置字段里

为了增加一些额外的安全保护,SqlMembershipProvider还提供了MinRequiredPasswordLength,MinRequiredNonAlphanumericCharacters,PasswordStrengthRegularExpression三个属性来加强保护,根据字面意思应该是密码最小长度,最少特殊字符数,密码正则表达式。

8.帐户锁定

为了抵御穷举密码 猜密码的攻击,SqlMembershipProvider提供了一个自动锁定用户的机制,当一个帐户在一段时间内连续登录失败超过一定次数后,这个用户将被锁定,SqlMembershipProvider的MaxInvalidPasswordAttempts和PasswordAttemptWindow属性,默认MaxInvalidPasswordAttempts=5次,PasswordAttemptWindow=10分钟。当数据表里的IsLockedOut=1时用户就被锁定了。

对Membership Provider等Provider微软提供了源代码,但这些源代码和.Net框架里包含的是有区别的,主要是为了能让提供的源代码能让用户独立的编译和运行。

这篇关于Membership学习(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/780111

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件