感谢明居: http://www.openlab.net.cn/forums/posts/863991.aspx
//声明:文中多处引用OL的源码,呵呵
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<remove name="LocalSqlServer" />
<add name="stuclubSqlServer" connectionString="server= (local);uid=;pwd=;Trusted_Connection=yes;database=" />
<add name="storageSqlServer" connectionString="server=(local);uid=;pwd=;Trusted_Connection=yes;database=" />
<add name="LocalSqlServer" connectionString="server=(local);uid=;pwd=;Trusted_Connection=yes;database=" />
</connectionStrings>
<system.web>
<compilation debug="true" batch="true">
<assemblies>
<add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="Accessibility, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Deployment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Runtime.Serialization.Formatters.Soap, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
</assemblies>
</compilation>
<machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77" decryption="3DES" validation="SHA1"/>
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="~/user/login.aspx"
defaultUrl="default.aspx" protection="All"
timeout="60" path="/" requireSSL="false"
slidingExpiration="true" cookieless="UseDeviceProfile"
domain ="" enableCrossAppRedirects="false">
<credentials passwordFormat="SHA1"/>
</forms>
<passport redirectUrl="internal"/>
</authentication>
<anonymousIdentification enabled="true" cookieName=".ASPXANONYMOUS" cookieTimeout="100000" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="None" domain=""/>
<customErrors mode="Off" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm"/>
<error statusCode="404" redirect="FileNotFound.htm"/>
</customErrors>
<membership userIsOnlineTimeWindow="60">
<providers>
<clear />
<add name="AspNetSqlMembershipProvider" applicationName="stuclub"
type="Stuclub.Users.DataProviders.SqlMembershipProvider, Stuclub.CommonLib" connectionStringName="LocalSqlServer"
enablePasswordRetrieval="true" enablePasswordReset="true" requiresQuestionAndAnswer="false"
minRequiredPasswordLength="4" minRequiredNonalphanumericCharacters="0"
requiresUniqueEmail="true" passwordFormat="Clear" />
</providers>
</membership>
<roleManager enabled="true" cacheRolesInCookie="true" cookieName=".StuRoles"
cookieTimeout="90" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" createPersistentCookie="true" cookieProtection="All" maxCachedResults="1000">
<providers>
<clear />
<add
connectionStringName="LocalSqlServer"
applicationName="stuclub"
name="AspNetSqlRoleProvider"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</roleManager>
< profile enabled="true">
<providers>
<clear />
<add name="SqlProvider"
type="System.Web.Profile.SqlProfileProvider"
connectionStringName="LocalSqlServer"
applicationName="stuclub"
description="SqlProfileProvider for SampleApplication" />
</providers>
</profile>
<pages validateRequest="false" enableEventValidation="false" autoEventWireup="true">
<namespaces>
<add namespace="System.Globalization"/>
</namespaces>
<controls>
</controls>
</pages>
<httpModules>
<add name="stuHttpModule" type="Stuclub.HttpModule.BaseHttpModule, Stuclub.CommonLib"/>
</httpModules>
<httpHandlers>
<add path="test.ashx" verb="GET" type="Stuclub.Applications.News.HttpHandlers.Test, Stuclub.Applications.News"/>
</httpHandlers>
<globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="utf-8" culture="zh-CN" uiCulture="zh-CN"/>
<httpRuntime maxRequestLength="1048576" executionTimeout="1200"/>
</system.web>
</configuration>
以上是标准的asp.net2.0 Web.config文件的配置.
其中主要包括连接数据的字符串配置,基于Forms验证的配置,成员资格管理的配置,成员角色的配置及成员扩展属性的配置, 还包括页面编码、自定义处理模块、页面请求验证、自定义的控件前辍声明等等,下面我来一一说明其是如何使用的。
1、连接数据库字符串的定义节
<connectionStrings>
<remove name="LocalSqlServer" /> <!--remove是指删除系统中自带的Web.config(位于C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/CONFIG)中的LocalSqlServer配置,以便使用如下的LocalSqlServer-->
<add name="stuclubSqlServer" connectionString="server=(local);uid=;pwd=;Trusted_Connection=yes;database=" /><!--用于连接数据库,其中的用户名密码已略去~-->
<add name="storageSqlServer" connectionString="server=(local);uid=;pwd=;Trusted_Connection=yes;database=" />
<add name="LocalSqlServer" connectionString="server=(local);uid=;pwd=;Trusted_Connection=yes;database=" />
</connectionStrings>
程序中如何使用这个配置呢? 代码如下:
stringconnstr=ConfigurationManager.ConnectionStrings["stuclubSqlServer"].ToString(); //这就得到了connectionString的值:server=(local);uid=;pwd=;Trusted_Connection=yes;database=stuclub20SqlConnection conn = new SqlConnection(connstr); //建立连接conn.Open();//打开连接
2、基于Forms的验证模块
使用的配置节如下:
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="~/user/login.aspx"
defaultUrl="default.aspx" protection="All"
timeout="60" path="/" requireSSL="false"
slidingExpiration="true" cookieless="UseDeviceProfile"
domain ="stuclub.cn" enableCrossAppRedirects="false">
<credentials passwordFormat="SHA1"/>
</forms>
<passport redirectUrl="internal"/>
</authentication>
<anonymousIdentification enabled="true" cookieName=".ASPXANONYMOUS" cookieTimeout="100000" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="None" domain=""/>
说明:<authentication>节中,mode="Forms" 表示我们使用的验证方式是基于Forms的验证, 当然还包括基于Windows的和Passport的验证方式.
<forms></forms>配制节最为关键, 其中的name指Cookie的名字,timeout指Cookie的过期时间,domain指使用的域名,我们网站就将此设置为stuclub.cn, 这样可以保证Cookie跨域访问,即可以实现多个子网共享用户的状态。其他的属性大家百度上一搜就会明白,在此我不多说。我要说明的是,这些配置在代码中是如何读取和实现的。
Forms节中的配置主要供Asp.net2.0自带的身份验证基制使用的,用于登录验证模块:
在登录验证事件触发后,我们要执行以下操作:
string username = txtUserName.Text;
string password = txtPwd.Text;
User userToLogin = null;
LoginUserStatus loginStatus = UserManager.ValidateUser(username, password, out userToLogin);//验证用户是否是合法用户,即从数据库中读取用户的注册信息,进行比较,如果一致,则成功!//进行验证要用到下面的成员资格(Membership)模块,下面会说明if (loginStatus == LoginUserStatus.Success) //如果验证成功
{
FormsAuthentication.SetAuthCookie(userToLogin.Username, true);//将身份验证Cookie添加到Http响应,供程序使用,这里的Cookie属性就是配置文件中设置的相关属性
}但是,如果我想自己写代码实现Cookie的相关属性控制,该怎么办呢?看看下面的代码先!//在OL中有如下的代码if (loginStatus == LoginUserStatus.Success || (enableBannedUsersToLogin && loginStatus == LoginUserStatus.AccountBanned))
{
HttpCookie formsAuthCookie;
formsAuthCookie = FormsAuthentication.GetAuthCookie(userToLogin.Username, autoLoginUser);UserCookie userCookie = context.User.GetUserCookie();//得到自定义的Cookie,用于获取上次访问时间,和身份验证无关,此Cookie的名字是"OL-UserCookie:" + user.UserId.ToString();userCookie.WriteCookie(formsAuthCookie, 30, autoLoginUser);//代替FormsAuthentication.SetAuthCookie方法,以实现自定义Cookie设置。
}//下面是UserCookie类中的WriteCookie方法public void WriteCookie(HttpCookie cookie, int days, bool autoLogin)
{
string cookieDomain = Globals.GetSiteSettings().CookieDomain;
string currentURL = HttpContext.Current.Request.Url.AbsoluteUri;
Regex matchNotTLD = new Regex("[_a-zA-Z0-9-]+( //.[_a-zA-Z0-9-]+)+$ ", RegexOptions.Compiled | RegexOptions.IgnoreCase);//Check if we are not breaking functionality because of bad domain setting
if ((matchNotTLD.IsMatch(cookieDomain)) && (currentURL.IndexOf(cookieDomain) > -1))
{
cookie.Path = "/";
cookie.Domain = cookieDomain;
}if (autoLogin)
cookie.Expires = DateTime.Now.AddDays(days);//设置过期时间context.Response.Cookies.Add(cookie);
}
大家需要注意的是,asp.net2.0里身份验证的机制对我们是隐藏的,我们只需进行以上的Forms节配置和以上代码的编写就可以完成身份验证了,至于具体的Cookie值是如何读取的,匿名用户是如何得到的及角色是如何管理的都在asp.net2.0内部实现了,这到底是如何实现的呢,下面我简要解释一下:
在machine.config文件(路径为C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/CONFIG)中, 大家会看到如下的配置:
<section name="httpCookies" type="System.Web.Configuration.HttpCookiesSection, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<section name="anonymousIdentification" type="System.Web.Configuration.AnonymousIdentificationSection, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" allowDefinition="MachineToApplication" />
<section name="roleManager" type="System.Web.Configuration.RoleManagerSection, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" allowDefinition="MachineToApplication" />
这就是用来处理Cookie的2.0自带的处理类,即System.Web.Configuration.HttpCookiesSection,当然还有其他的一些配置如:anonymousIdentification、roleManager,这两个是分别用来处理匿名用户和角色管理的。
如:第一次请求页面时,asp.net IIS处理程序会调用System.Web.Configuration.AnonymousIdentificationSection类,以获取匿名用户的相关信息,如匿名用户的用户名。
这些自带的类的实现对我们是隐藏的,大家可以不必去关心他。微软的想法就是把我们都变成傻瓜,呵呵。 当然我们可以自己通过写代码来实现,只是比较麻烦了,大家有兴趣可以找些相关的资料啦~~
然而,仅通过Forms这个配置节是不能够进行完整的身份验证的,它只是设置了用户身份验证需要的一些必要属性,如Cookie路径,Cookie域,超时时间等等,并没有说明如何进行用户验证,以及验证成功以后用户拥有哪些角色,用户能做些什么。只有结合Membership、roleManager和profile配置和相关处理机制才能进行完整的身份验证。 以下就来介绍这三个配置。
3、Membership配置节
<membership userIsOnlineTimeWindow="60">
<providers>
<clear />
<add name="AspNetSqlMembershipProvider" applicationName="stuclub"
type="Stuclub.Users.DataProviders.SqlMembershipProvider, Stuclub.CommonLib" connectionStringName="LocalSqlServer"
enablePasswordRetrieval="true" enablePasswordReset="true" requiresQuestionAndAnswer="false"
minRequiredPasswordLength="4" minRequiredNonalphanumericCharacters="0"
requiresUniqueEmail="true" passwordFormat="Clear" />
</providers>
</membership>
此节用于成员资格的验证,即验证用户的密码,Email,密码丢失管理,获取用户等等等。
其中的<providers>节配置了进行成员资格验证的提供者,这里的提供者是:Stuclub.Users.DataProviders.SqlMembershipProvider类,此类在 Stuclub.CommonLib 程序集中。
<clear/>用于清除系统自带的Machine.config中的配置。
<add>节中,applicationName指我们的应用程序的名称,asp.net2.0中设置此属性的目的是多个应用程序共用一个数据库用户表,这样可以很容易的扩展别的应用程序,而不用改动数据库表。type指进行成员资格验证的提供者(就是一个类)的类型信息。connectionStringName指定使用哪个数据库,这里是LocalSqlServer,请参见 1、连接数据库字符串的定义节。
注意:这里的提供者不是使用 asp.net2.0自带的提供者类,而是的重写System.Web.Security.MembershipProvider类的自定义类。
如下的roleManager和profile和Membership配置是一样的道理,不在赘述!
4、roleManager配置节
<roleManager enabled="true" cacheRolesInCookie="true" cookieName=".StuRoles"
cookieTimeout="90" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" createPersistentCookie="true" cookieProtection="All" maxCachedResults="1000">
<providers>
<clear />
<add
connectionStringName="LocalSqlServer"
applicationName="stuclub"
name="AspNetSqlRoleProvider"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</roleManager>
这里的提供者是asp.net2.0自带的,也可以自己重写。此类用来管理用户的角色,如获取、添加和删除用户的角色,以供程序使用。
如以下代码:
///<summary>///添加角色///</summary>
5、profile配置节
<profile enabled="true">
<providers>
<clear />
<add name="SqlProvider"
type="System.Web.Profile.SqlProfileProvider"
connectionStringName="LocalSqlServer"
applicationName="stuclub"
description="SqlProfileProvider for SampleApplication" />
</providers>
</profile>
这里的提供者是asp.net2.0自带的,也可以自己重写。
6、<pages>节
<pages validateRequest="false" enableEventValidation="false" autoEventWireup="true">
<namespaces>
<add namespace="System.Globalization"/>
</namespaces>
<controls>
</controls>
</pages>
此节用于配置使用的命名空间和自定义控件的前缀,不再多说
7、HttpModules节
<httpModules>
<add name="stuHttpModule" type="Stuclub.HttpModule.BaseHttpModule, Stuclub.CommonLib"/>
</httpModules>
用户配置自定义的处理模块。请求任何应用程序中任一个页面都要经过此配置中添加的处理类的过滤,上面配置的类是Stuclub.HttpModule.BaseHttpModule。在这里可以向页面响应添加的版本信息,进行地址重定向等等。如:
voidcontext_BeginRequest(objectsender, EventArgs e)//每次请求页面时都会执行{HttpApplication application=(HttpApplication)sender;HttpContext context=application.Context;CommonContext commonContext=newCommonContext(context);if(context.Request.RawUrl.IndexOfAny(newchar[] {'<','>','/'','"'})!=-1){context.Response.Redirect(context.Request.RawUrl.Replace("<","%3c").Replace(">","%3e").Replace("/'","%27").Replace("/"","%22"));return;}context.Response.AddHeader("Stuclub", SiteStatistics.Version.ToString());//添加的版本信息}
7、HttpHandlers节
只针对某个页面进行自定义处理!
<httpHandlers>
<add path="test.ashx" verb="GET" type="Stuclub.Applications.News.HttpHandlers.Test, Stuclub.Applications.News"/>
</httpHandlers>
8、编码配置
网站的编码配置为utf-8,这样可以解决js脚本取数据时编码的问题,所以一般网站都采用此设置,而尽量不要使用gb2312编码。
<globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="utf-8" culture="zh-CN" uiCulture="zh-CN"/>
9、全局请求设置
<httpRuntime maxRequestLength="1048576" executionTimeout="1200"/>
请大家网上查看!!
小结
有了这些标准配置以后,我们就可以很容易来做asp.net2.0的应用了,而且我们还可以直接把自带的登陆控件,修改密码控件,找回密码控件等直接拿过来使用而不用写任何代码。很是方便!
貌似OL上的技术文章太少了,今天偶有兴趣,就随便写了篇,希望能给做asp.net的同学一点启发,也敬请高手们指点!