用户的身份验证和授权是从用户处获取用户凭据如用户名和密码,并通过某些授权机构验证那些凭据的过程。如果这些凭据有效,则视为通过身份验证上,在身份得到验证后,并确定该身份是否可以访问特定资源。几乎所有的web站点和基于浏览器的系统中都会使用的功能,例如:新建、修改、删除用户和角色,为用户分配角色,管理角色中的用户等等。身份验证是确认用户身份的过程,就是解决是谁的问题,在用户通过身份验证后,可以确定该用户是否有权继续操作。而授权是确定经过身份验证的用户是否有权访问应用程序的中某个页面、某个点或是特定数据集,也就是解决这个人可以干什么的问题。实际在网站和web应用程序中身份验证和授权是每个页面都需要考虑的事情,也就是安全性要贯穿始终。而web应用程序则要求更高,因为其中可能涉及到网上支付、账户信息等重要的客户信息。
MS在ASP.NET 2.0开始,实现了这些功能,使得我们在开发中,不需要考虑这方面的内容,把更多的精力投入到业务逻辑的开发中去。从而大大的提高了开发的效率。下面我们就来学习一下如何使用membership。
要使用membership首先需要数据库的支持,所以我们第一步就是创建用来存放用户、角色等信息的表结构。别担心,MS早就把创建表的语句写好了,并且还提供了用户界面,让我们点点鼠标就可以创建好所需的结构了。
具体操作如下:进入C:\WINDOWS\Microsoft.NET\Framework\v2.0.xxxxx(vs2010的目录是v4.0.xxxx)这个目录下找到aspnet_regsql.exe直接双击运行,或是在开始菜单—Visual Studio 2008—Visual Studio Tools—Visual Studio2008命令提示,进入dos窗口,命令行光标提示处输入aspnet_regsql.exe,就会弹出“Asp..net SQL Server安装向导”界面,直接下一步。第二个界面让我们选择是添加表结构还是移除,我们当然选择添加,继续下一步。在这个界面中需要填写服务器ip地址以及身份验证信息。在填写完毕后,就可以选择你要将表结构添加到哪个数据库中了。需要注意的是:如果选择默认,则会创建一个新的名叫aspnetdb的数据库,然后将表结构加入其中。一路下一步就完成了数据库结构的添加。
好了,表结构添加完毕,接下来就是需要在项目中进行一些简单的配置了。先是在修改服务器即本机的配置文件,之后再修改网站的配置文件。我们在vs中新建一个网站,随后再用记事本打开C:\WINDOWS\Microsoft.NET\Framework\v2.0.xxxxx\CONFIG\machine.config这个文件,找到system.web节点下的membership节点,将整个节点复制到我们新建网站的web.config中的system.web节点中。
复制过来的代码如下:
<providers>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""/>
</providers>
</membership>
下面是主要的几个属性的含义:
name:数据提供程序的名称,由于我们是从machine.config复制过来的,所以必须改名,防止重名。
type:数据提供程序类型,如果使用的是MSSQL数据库,则保持不变即可,如果使用的是Oracle等其他数据库,则必须自己创建一个类来继承MembershipProvider抽象基类,重写里边的所有抽象方法,然后把类型写在这里即可。
connectionStringName:该属性必须指定在<connectionStrings>节点中,一个连接字符串的名字。
enablePasswordRetrieval:确定提供程序是否支持密码的获取。默认是false。设置为false时,不能检索密码,但可以用一个新的随机密码替代。
enablePasswordReset:确定提供程序是否支持密码的重置。默认为true。
requiresQusetionAndAnswer:在创建用户时,指定提供程序是否需要问答组合。默认为false。
applicationName:应用程序名称,membership允许多个应用程序共同使用一个数据库来管理自己的用户、角色信息,各应用程序只需配置不同的applicationName即可,当然,如果想要多个应用程序使用同一份用户角色信息,只需设置一样的applicationName即可。
requiresUniqueEmail:顾名思义,用户注册时,是否需要提供未注册过的邮箱。
passwordFormat:密码存储格式,密码保存在数据库中的格式,最常用的有Clear(不加密)和Hashed(使用SHA1算法加密)。
maxInvalidPasswordAttempts :锁定成员资格用户前允许的无效密码或无效密码提示问题答案尝试次数。
minRequiredPasswordLength:最小密码长度。
minRequiredNonalphanumericCharacters:指定有效密码中必须包含的特殊字符的最小数量,就是说不是字母也不是数字的字符的数量,比如+-*/,.什么的,增加密码强度。
passwordAttemptWindow:在锁定成员资格用户之前允许的最大无效密码或无效密码提示问题答案尝试次数的分钟数。这是为了 防止不明来源反复尝试来猜测成员资格用户的密码或密码提示问题答案的额外措施。
passwordStrengthRegularExpression:计算密码的正则表达式。
好了,我们将配置修改一下并添加连接字符串:
<add name="ConnectionString" connectionString="server=.;uid=sa;pwd=sa;database=aspnetdb"/>
</connectionStrings>
<system.web>
<membership defaultProvider="mySqlMembershipProvider">
<providers>
<add name="mySqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="ConnectionString"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="TestMembership"
requiresUniqueEmail="true"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="6"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""/>
</providers>
</membership>
</system.web>
上面用 黄色高亮字体 标注出来的属性,是为了告诉membership采用我们刚才添加的 mySqlMembershipProvider 这个配置,因为machine.config中有一个 AspNetSqlMembershipProvider, 我们又在web.config中又添加了一个 mySqlMembershipProvider,现在有了两个配置,所以应该使用defaultProvider属性指明本网站使用哪个配置。随后又指定了连接字符串配置的名称,一个Email不允许重复注册,最小密码长度为6,不限制密码中必须含有标点符号等配置。
membership算是配置到这里了,但是还没有结束,我们还需要把ASP.NET的身份验证机制配置为Forms身份验证(详见web.config配置详解)。
配置Forms身份验证其实就是把下面代码复制到web.config中去就可以了:
<system.web>
<authentication mode="Forms">
<forms loginUrl="Login.aspx"
protection="All"
timeout="30"
name=".ASPXAUTH"
path="/"
slidingExpiration="true"
defaultUrl="default.aspx"
cookieless="UseDeviceProfile"/>
</authentication>
</system.web>
下面是说明(msdn抄的):
loginUrl 指向应用程序的自定义登录页。应该将登录页放在需要安全套接字层 (SSL) 的文件夹中。这有助于确保凭据从浏览器传到 Web 服务器时的完整性。
protection 设置为 All,以指定窗体身份验证票的保密性和完整性。这导致使用 machineKey 元素上指定的算法对身份验证票证进行加密,并且使用同样是machineKey 元素上指定的哈希算法进行签名。
timeout 用于指定窗体身份验证会话的有限生存期。默认值为 30 分钟。如果颁发持久的窗体身份验证 Cookie,timeout 属性还用于设置持久 Cookie 的生存期。
name 和 path 设置为应用程序的配置文件中定义的值。
requireSSL 设置为 false。该配置意味着身份验证 Cookie 可通过未经 SSL 加密的信道进行传输。如果担心会话窃取,应考虑将 requireSSL 设置为 true。
slidingExpiration 设置为 true 以执行变化的会话生存期。这意味着只要用户在站点上处于活动状态,会话超时就会定期重置。
defaultUrl 设置为应用程序的 Default.aspx 页。
cookieless 设置为 UseDeviceProfile,以指定应用程序对所有支持 Cookie 的浏览器都使用 Cookie。如果不支持 Cookie 的浏览器访问该站点,窗体身份验证在 URL 上打包身份验证票。
enableCrossAppRedirects 设置为 false,以指明窗体身份验证不支持自动处理在应用程序之间传递的查询字符串上的票证以及作为某个窗体 POST 的一部分传递的票证。
需要说明一下的是LoginUrl和DefaultUrl属性:LoginUrl指向登录页面,当ASP.NET判断出该用户请求的资源不允许匿名访问,而该用户未登录时,ASP.NET会自动跳转到LoginUrl所指向的页面,当登录成功后,则跳转回原来请求的页面。DefaultUrl指向默认页面。当我们直接访问登录页面,并登录成功后,这时ASP.NET会跳转到DefaultUrl指向的页面。其他的选项不写都可以,因为有默认值。
来源于:
http://www.cnblogs.com/xlb2000/archive/2010/05/10/1729076.html