Asp.Net认证和授权扩展

原来的Membership

    我们知道在Asp.Net 2.0中微软就为我们提供了强大的权限管理功能来帮助我们管理Asp.Net相应的权限,其实它是对我们的身份认证和权限管理的一种抽象。这里简单的了解一下Membership:

我们应该知道微软关于认证方面给我们提供了三种认证方式windows 、Forms、Passport,我想熟悉Asp.Net的用户都知道我们使用Forms认证应该是最多的。但是应该指出的就是这些只是身份认证方面的,和Membership成员管理是分开的而不是我们要用Forms认证就必须使用Membership。例如假设我们的站点只牵扯到用户的登录而不需要进行相应的角色划分以及使用Membership创建用户等方法的话就完全只使用Forms认证就可以了(像只使用Forms认证的情况,我们用户注册,用户身份认证就必须我们自己来做了。我们可以建立用户表,注册的时候只需要写相应的用户信息到表中,登录的时候读取数据库中相应的信息做匹配,如果正确就执行FormsAuthentication.SetAuthCookie(UserName, false)就可以了)。这时我们所有的用户信息管理都是自己来做的,当然灵活性很高了,我们仅仅用到Forms认证的基本功能(像没有登录自动回到登录页面、登录之后可以在其他任何位置得到用户相关信息等)。但是如果用户认为自己管理这些信息比较麻烦,而且有时候我需要用到角色管理的话我们就不得不提到Membership了,有了它整个身份认证和权限管理就很容易了。这里说一下它的本质,Membership之所以让用户那么随心所欲的操作而不需写很多的代码是因为它本省做了大量的封装,很多人不明白用户信息存储在什么地方,其实它是存储到了ASPNETDB.mdf这个数据库中。这时初学者就疑问这个数据库我没有建立啊,而且我在创建工程的时候也没看到这个数据库啊,况且数据库连接字符串在什么地方啊?这个数据库是系统自动建立的,是自动附加的,当使用Membership类时自动创建放在App_Data文件夹的,系统刚开始创建时由于系统不知道是否使用Membership所以肯定当时没有创建,而且数据库连接字符串是必须的肯定有的,它在Machine.config中,这个文件具体作用我想大家应该看看asp.net运行机制就知道了,它是优先于web.config的一个配置文件。Membership提供了创建用户、得到用户、删除用户、验证用户等一系列的功能,而且与Role紧密结合管理用户角色。除此之外微软还提供了相应的控件使用户更加容易的使用Membership。

Membership扩展

    Membership那么好,我们都用它不就行了吗?首先应该说明的是它确实好用,但是我们知道封装越多灵活性就越低。在Membership中我们不用管它的数据库,只管使用就可以了。但是例如原来的用户信息比较少,我现在想给用户添加一个熟悉就是用户QQ怎么办(这个问题可以用profile解决,但是它确实灵活性)?如果我感觉不想在我的系统中用aspnetdb数据库怎么办?还有很多和具体使用有关的问题都可能出现。或许有些人就想开始自己写权限管理功能了,但是一个权限管理不是很快就写的很完善的。怎么办?我们不妨继续使用Membership而将这个数据库中的表放在自己的数据库中,如果有需要我们扩展这些表。

好了,我们开始做吧。首先就是aspnetdb这个数据库有几张表,而且其中存在着存储过程之类的东西我们怎么移植到我们自己的数据库中?这个问题其实很容易解决,微软给我们提供了一个小工具aspnet_regsql.exe(在windows中.net framework 中可以找到)来帮助我们复制表结构到我们已有数据库,我们双击即可运行,按照向导去做就可以了。我们完成之后发现我们的数据库中确实多了很多表,这些表结构和aspnetdb是完全一样的。第二个问题又出现了,我们如何让asp.net应用程序使用我们自己的表而不是使用原来的aspnetdb呢?我们可以通过连接字符串就可以了,关键就是machine.config中也有相应的字符串,这时我们可以通过clear清楚原来的字符串然后让系统使用我们自己的字符串。

我们看一下配置文件部分信息:

<connectionStrings> <add name="ConnectionString" connectionString="Data Source=./sqlexpress;Initial Catalog=MembershipExtend;Integrated Security=SSPI" providerName="System.Data.SqlClient"/> </connectionStrings>

<authentication mode="Forms"> <forms loginUrl="Login.aspx" defaultUrl="Default.aspx" protection="All"></forms> </authentication> <authorization> <deny users="?"/> <allow users="*"/> </authorization> <membership> <providers> <clear/> <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ConnectionString" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/" /> </providers> </membership>

<location path="CreateUser.aspx"> <system.web> <authorization> <allow users="*"/> </authorization> </system.web> </location>

    我们可以看我首先配置自己的连接字符串,和一般字符串没有任何区别(如果非要说有区别就是我字符串中的数据库包含和aspnetdb数据库一样的表),然后我再provider中先清除原来的字符串,然后配置自己的(主要在这里指明用的连接字符串,而且我还配置了一些其他信息像minRequiredNonalphanumericCharacters=0就允许密码可以不输入特殊字符等)。再者就是location中指明任何人都可以访问CreateUser.aspx页面(它是创建用户的页面允许没有注册信息的用户注册)。然后,我正常使用Membership创建一个用户,可看到我的数据库MembershipExtend中确实有相应的信息存在。

    现在我又有了第二个问题,就是原来的用户信息列不够用,例如我的系统是一个MIS,其中包含员工信息,而我需要每个用户都是Employee,所以想在Users表中加入两列EmployeeID和EmployeeName,该怎么办呢?

我在数据库中重新建立一张表叫aspnet_UserInfo(ID,UserName,EmployeeID,EmployeeName),然后建立了aspnet_UserInfo 、aspnet_Users和aspnet_Membership三表之间的视图(之所以还有aspnet_Membership是因为user的一部分信息在这里面)叫vw_aspnet_UserAllInfo。这样一来创建用户的时候我们除了调用Membership的CreateUser方法外只需要在按照自己的操作在aspnet_UserInfo充插入相关信息就可以了。得到用户信息的话我们可以通过上面建立的视图就可以轻松得到了。

当然了,除了上面的功能我们的Membership还可以结合Role类进行角色管理,这点请放心我们的扩展之后对于成员管理只需要进行正常操作既可以了,我们在扩展时完全没有问题的。

    好了,为了大家更清楚我们将源代码提供给大家下载:MembershipExtend

你可能感兴趣的:(数据库,Authentication,asp.net,扩展,authorization,Forms)