您的位置:首页 > 编程语言 > ASP

Asp.Net Forms验证(自定义、角色提供程序、单点登录)

2008-04-22 19:56 609 查看
以前开发项目时经常是自己开发一套用户权限管理系统进行验证,比较灵活。最近为了单点登录的问题又把Asp.Net自带的验证方式看了一遍,发现这种方式也比较方便,功能也还可以。在Asp.Net提供了三种常用的验证方式:Windows方式是和IIS结合起来可以实现基本、摘要、集成 Windows等身份验证;Passport方式是使用Windows Live ID的帐户来进行统一验证的;Forms方式是使用常见的表单来实现验证。

本文主要就是讨论Forms验证方式普通实现、自定义实现、自定义角色提供程序、如何单点登录(可和MOSS结合)等几个方面。

一、普通实现方式

这种方式是最简单的,只需要配置一下就可以了。

1、执行aspnet_regsql命令建立数据库

aspnet_regsql命令在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727目录下,按提示运行就可以了

2、新建一个web网站

在Web.Config中加入配置:

<connectionStrings>

<add name="MySqlConnection" connectionString="Data Source=dbserver;Initial Catalog=database;user id=userid;password=****;" />

</connectionStrings>

<system.web>

<authorization>

<deny users="?"/>

</authorization>

<authentication mode="Forms">

<forms loginUrl="login.aspx" name=".ASPXAUTH"/>

</authentication>

<membership defaultProvider="SqlProvider">

<providers>

<clear />

<add connectionStringName="MySqlConnection" applicationName="MyApplication"

enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true"

requiresUniqueEmail="true" passwordFormat="Hashed" name="SqlProvider"

type="System.Web.Security.SqlMembershipProvider" />

</providers>

</membership>

</system.web>
主要就是指定Forms验证使用的数据库,如果不指定数据库会使用本机默认的aspnetdb 数据库。

deny users="?"表示不允许匿名用户访问,也就是说当匿名用户访问时自动跳转到下面配置的login.aspx页面。

至于authorization和authentication节的其他属性可以参考MSDN,里面有很详细的介绍。

3、在网站里创建Default.aspx和Login.aspx页面

在Login.aspx页面里面放入Login和CreateUserWizard控件(因为我们新建的库中一个用户也没有,CreateUserWizard控件只是用来建立测试用户的,建好用户后可以把这个控件删除)

在Default.aspx页面中随便放入一些内容。

当我们访问Default.aspx时就会自动转入Login.aspx进行验证了。

二、自定义实现方式

采用第一种方式时会要求建立一个数据库,很多表,可能并不符合我们自己的业务要求。可以使用以下的自定义方式

1、利用Login控件的Authenticate事件

这个事件就是用来进行验证的,可以通过指定true值表示验证通过:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)

protected void Button1_Click(object sender, EventArgs e)

protected void Button1_Click(object sender, EventArgs e)

<roleManager defaultProvider="MyRoleProvider"

enabled="true"

cacheRolesInCookie="true"

cookieName=".ASPROLES"

cookieTimeout="30"

cookiePath="/"

cookieRequireSSL="false"

cookieSlidingExpiration="true"

cookieProtection="All" >

<providers>

<clear />

<add name="MyRoleProvider"

type="MyRoleProvider"

writeExceptionsToEventLog="false" />

</providers>

</roleManager>
这个就是指定我们的角色提供类MyRoleProvider。

这个类必须从System.Web.Security.RoleProvider继承,只要重载实现一个方法就可以了(其他方法返回异常):

public override string[] GetRolesForUser(string username)

<location path="admin">

<system.web>

<authorization>

<allow roles="Admins"/>

<deny users="*"/>

</authorization>

</system.web>

</location>
或者也可以在代码中判断:

bool a = User.IsInRole("testt");
判断起来还是很方便的。

四、单点登录

使用Forms的单点登录主要是通过machineKey的配置,machineKey 元素对密钥进行配置,以便将其用于对 Forms 身份验证 Cookie 数据和视图状态数据进行加密和解密,并将其用于对进程外会话状态标识进行验证

使用这种方式的单点登录目前只能实现相同主机或相同子域站点之间的同步登录,比如www.cnblogs.com和firstyi.cnblogs.com可以实现,但是www.cnblogs.com和www.sina.com.cn就不能实现了,对于非同一父域名下的域名间不能跨站登录

主要配置如下:

<machineKey validationKey="282487E295028E59B8F411ACB689CCD6F39DDD21E6055A3EE480424315994760ADF21B580D8587DB675FA02F79167413044E25309CCCDB647174D5B3D0DD9141" decryptionKey="8B6697227CBCA902B1A0925D40FAA00B353F2DF4359D2099" validation="SHA1"/>

<authentication mode="Forms">

<forms loginUrl="login.aspx" name=".ASPXAUTH1" domain=".cnblogs.com" />

</authentication>
要实现单点登录的多个web站点的machineKey必须一样,forms里面的name和domain也必须一样

这样配置好之后,在其中一个站点登录后再调转到另一个站点就不需要再次登录了。

注:如果MOSS网站采用Forms验证方式的话,只要把MOSS站点的对应配置改成和自己的Asp.Net站点一致,那么可以从自己的站点直接进入MOSS站点,也不需要重新登录(MOSS站点和自己的站点要有相同的用户名)

其他:

Forms验证之后可以使用以下方法退出登录:

FormsAuthentication.SignOut();

另外这些登录的后台Module是配置在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config文件中的:

<add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule"/>

<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/>

<add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule"/>

附:

<?xml version="1.0"?>

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

<system.web>

<authorization>

<deny users="?"/>

</authorization>

<authentication mode="Forms">

<forms loginUrl="login.aspx" name=".ASPXAUTH1" domain=".cnblogs.com" />

</authentication>

<machineKey validationKey="F9A61F796A204D9945889B64D9DA5086E89CEC5200F0CED4" decryptionKey="D679BCF2A76DEBB04D7FED5E5967F46C92FEF2B31AD5D7C9" validation="SHA1" />

<compilation debug="true"/>

<roleManager defaultProvider="MyRoleProvider"

enabled="true"

cacheRolesInCookie="true"

cookieName=".ASPROLES"

cookieTimeout="30"

cookiePath="/"

cookieRequireSSL="false"

cookieSlidingExpiration="true"

cookieProtection="All" >

<providers>

<clear />

<add name="MyRoleProvider"

type="MyRoleProvider"

writeExceptionsToEventLog="false" />

</providers>

</roleManager>

</system.web>

<location path="admin">

<system.web>

<authorization>

<allow roles="Admins"/>

<deny users="*"/>

</authorization>

</system.web>

</location>

</configuration>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: