以前开发项目时经常是自己开发一套用户权限管理系统进行验证比较灵活最近为了单点登录的问题又把AspNet自带的验证方式看了一遍发现这种方式也比较方便功能也还可以在AspNet提供了三种常用的验证方式Windows方式是和IIS结合起来可以实现基本摘要集成 Windows等身份验证Passport方式是使用Windows Live ID的帐户来进行统一验证的Forms方式是使用常见的表单来实现验证
一普通实现方式
这种方式是最简单的只需要配置一下就可以了
执行aspnet_regsql命令建立数据库
aspnet_regsql命令在C:\WINDOWS\MicrosoftNET\Framework\v目录下按提示运行就可以了
新建一个web网站
在WebConfig中加入配置
<connectionStrings>
<add name=MySqlConnection connectionString=Data Source=dbserver;Initial Catalog=database;user id=userid;password=****; />
</connectionStrings>
<systemweb>
<authorization>
<deny users=?/>
</authorization>
<authentication mode=Forms>
<forms loginUrl=loginaspx 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=SystemWebSecuritySqlMembershipProvider />
</providers>
</membership>
</systemweb>主要就是指定Forms验证使用的数据库如果不指定数据库会使用本机默认的aspnetdb 数据库
deny users=?表示不允许匿名用户访问也就是说当匿名用户访问时自动跳转到下面配置的loginaspx页面
至于authorization和authentication节的其他属性可以参考MSDN里面有很详细的介绍
在网站里创建Defaultaspx和Loginaspx页面
在Loginaspx页面里面放入Login和CreateUserWizard控件(因为我们新建的库中一个用户也没有CreateUserWizard控件只是用来建立测试用户的建好用户后可以把这个控件删除)
在Defaultaspx页面中随便放入一些内容
当我们访问Defaultaspx时就会自动转入Loginaspx进行验证了
二自定义实现方式
采用第一种方式时会要求建立一个数据库很多表可能并不符合我们自己的业务要求可以使用以下的自定义方式
利用Login控件的Authenticate事件
这个事件就是用来进行验证的可以通过指定true值表示验证通过
protected void Login_Authenticate(object sender AuthenticateEventArgs e)
{
//判断用户名密码是否正确
//
eAuthenticated = true;
}
完全抛开Login等控件自己写代码
其实Login控件的核心主要也就是往Cookie里面放入一些值那么我们可以在自己的代码中来进行这个操作
protected void Button_Click(object sender EventArgs e)
{
//判断用户名密码是否正确
//
FormsAuthenticationSetAuthCookie(userName false);
if (ContextRequest[ReturnUrl] != null)
{
ResponseRedirect(ContextRequest[ReturnUrl]);
}
else
{
ResponseRedirect(FormsAuthenticationDefaultUrl);
}
}采用以上两种方式就不用建立默认的数据库了直接使用我们的逻辑进行验证操作
三自定义角色提供程序
以上说的都是用户级别的验证在有的情况下需要根据角色来进行验证比如指定某个目录或某个aspx文件只能让哪几个角色的用户访问根据角色来控制的话比较方便灵活
在登录验证的时候把角色信息也保存到Cookie中去
protected void Button_Click(object sender EventArgs e)
{
//判断用户名密码是否正确
//
//得到用户的角色测试时暂时写死
string userRoles = Adminstestst;
FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket( user DateTimeNow DateTimeNowAddMinutes() false userRoles /);
string HashTicket = FormsAuthenticationEncrypt(Ticket);
//把角色信息保存到Cookie中去
HttpCookie UserCookie = new HttpCookie(FormsAuthenticationFormsCookieName HashTicket);
ResponseCookiesAdd(UserCookie);
if (ContextRequest[ReturnUrl] != null)
{
ResponseRedirect(ContextRequest[ReturnUrl]);
}
else
{
ResponseRedirect(FormsAuthenticationDefaultUrl);
}
}把角色信息加密成特定的格式保存
自定义角色提供程序
如果要按照角色进行验证的话肯定要涉及到角色提供程序在默认情况下也是会去连接默认的数据库的我们可以自己写一个角色提供程序来实现自己的逻辑
首先在nfig中加入配置
Code
<roleManager defaultProvider=MyRoleProvider
enabled=true
cacheRolesInCookie=true
cookieName=ASPROLES
cookieTimeout=
cookiePath=/
cookieRequireSSL=false
cookieSlidingExpiration=true
cookieProtection=All >
<providers>
<clear />
<add name=MyRoleProvider
type=MyRoleProvider
writeExceptionsToEventLog=false />
</providers>
</roleManager>这个就是指定我们的角色提供类MyRoleProvider
这个类必须从SystemWebSecurityRoleProvider继承只要重载实现一个方法就可以了(其他方法返回异常)
public override string[] GetRolesForUser(string username)
{
FormsIdentity Id = HttpContextCurrentUserIdentity as FormsIdentity;
if (Id != null)
{
return IdTicketUserDataSplit(new Char[] { });
}
return null;
}也就是从我们之前保存到Cookie中的值取得用户角色(FormsAuthentication会自动把保存的cookie转化成User内的值)
之后我们就可以在nfig中配置角色验证规则了
<location path=admin>
<systemweb>
<authorization>
<allow roles=Admins/>
<deny users=*/>
</authorization>
</systemweb>
</location>或者也可以在代码中判断
bool a = UserIsInRole(testt);判断起来还是很方便的
四单点登录
使用Forms的单点登录主要是通过machineKey的配置machineKey 元素对密钥进行配置以便将其用于对 Forms 身份验证 Cookie 数据和视图状态数据进行加密和解密并将其用于对进程外会话状态标识进行验证
使用这种方式的单点登录目前只能实现相同主机或相同子域站点之间的同步登录比如和可以实现但是和就不能实现了对于非同一父域名下的域名间不能跨站登录
主要配置如下
<machineKey validationKey=EEBFACBCCDFDDDEAEEADFBDDBFAFECCCDBDBDDD decryptionKey=BCBCABADFAABFDFD validation=SHA/>
<authentication mode=Forms>
<forms loginUrl=loginaspx name=ASPXAUTH domain= />
</authentication>要实现单点登录的多个web站点的machineKey必须一样forms里面的name和domain也必须一样
这样配置好之后在其中一个站点登录后再调转到另一个站点就不需要再次登录了
注如果MOSS网站采用Forms验证方式的话只要把MOSS站点的对应配置改成和自己的AspNet站点一致那么可以从自己的站点直接进入MOSS站点也不需要重新登录(MOSS站点和自己的站点要有相同的用户名)
其他
Forms验证之后可以使用以下方法退出登录
FormsAuthenticationSignOut();
另外这些登录的后台Module是配置在C:\WINDOWS\MicrosoftNET\Framework\v\CONFIG\nfig文件中的
<add name=WindowsAuthentication type=SystemWebSecurityWindowsAuthenticationModule/>
<add name=FormsAuthentication type=SystemWebSecurityFormsAuthenticationModule/>
<add name=PassportAuthentication type=SystemWebSecurityPassportAuthenticationModule/>