你曾经碰到过多少网站需要你登录? 我猜想答案是绝大多数的站点,写这篇文章的目的就是介绍如何利用ASP.NET的验证和授权机制来创建站点,以及如何利用ASP.NET的控件来快速实现登录,用户管理的功能。
当我们要开发一个站点,而且必须实现验证和授权这些需求, 那么我们就会认识到ASP.NET的角色和用户管理功能非常的有用。验证意味着对用户进行检查,在这一步,我们会核查用户的身份信息以确认试图登录的用户是否有这个权限,授权,与验证不太一样,它是确保哪些是可以让用户看见的,哪些是必须隐藏起来的。
无论什么时候登录,用户都必须用它们的身份信息自我验证,一旦验证通过,系统将授权他可以去访问站点的某些资源或页面,对于非授权的页面或资源的访问,会导致系统出错。多数的时候,验证和授权是一起的,并且ASP.NET的控件帮助我们实现了这些功能。 如果我们利用ASP.NET的验证和授权机制,那么只要关心哪些是认证用户,以及可以授于他们哪些权限而不必担心如何去实现这些功能。
ASP.NET提供了不少控件便于我们实现验证的功能, 以下列出常用的几个:
Login
: 登录控件 PasswordRecovery
: 密码重置控件. CreateUserWizard
: 这个控件允许创建一个新的站点帐户. ChangePasword
: 修改密码控件. LoginStatus
: 显示用户是否登录的控件. LoginName
: 显示已经登录的用户名.对于授权部分, 角色机制是ASP.NET用来给用户授权的。 每个用户属于一个或多个角色 ,并且我们的页面也可以根据角色来设置,如果用户属于某个角色,他就被允许访问某个某面。
让我们写个例子程序来看看这些控件和概念在实际中的应用。 我们会开发一个小型的WEB站点,它有三种类型的用户: free 用户, regular 用户, and premium 用户。 每种类型的用户只能看到他们自己的页面和比他们低级的用户的页面,比如regular 用户可以查看free 用户的页面,而不能访问premium 的页面。 那么我们就创建如下结构的项目:
然后为每个角色分别创建目录,根目录下是free用户的文件。 现在我们要来设置目录的访问权限, 我们希望在项目中有两类角色: Regular 和Premium,剩下的都被认为是free。
那么让我们通过WSAT (Web Site Administration Tool)来创建角色,在VS2008中,选择WEBSITE->ASP.NET CONFIGURATION选项。
一旦创建好角色,我们还要配置访问规则。
对于Members目录,只允许Regular 和Premium访问。
对于目录, 只允许Premium访问
对于根目录,允许任何用户访问,包换未登录的。
当然, 我们也可以直接在web.config文件里设置。下面已经配置好对"Premium 用户"的控件。
<?xml version="1.0" encoding="utf-8"?> <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <system.web> <authorization> <allow roles="Premium" /> <deny users="*" /> </authorization> </system.web> </configuration> |
完成上面步骤后,我们就要确保这些不同的目录只能被特定的角色访问,很显然,接下来,我们要创建用户,并将他们赋予某个角色。
在创建用户之前,让我们了解下认证的两种方式:
在这个例子中,我们用“基于Forms 验证”方式,我们通过WSAT创建用户并设置角色。
注意在创建新用户的时候,如果你遇到下面的错误:
”密码最短长度为 7,其中必须包含以下非字母数字字符: 1“。
这段话翻译错了,其实它的意思是要你的密码足够复杂,不是 "其中必须包含以下非字母数字字符: 1 ",而是 "其中必须包含至少一个非字母数字字符 ",你只要有英文字母,数字,特殊字符,一定OK
当然,你也可以修改默认配置文件,位于C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG\machine.config 里找到:
<membership> <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> |
除了这种方式,我们应该允许立站点利用ASP.NET的服务器控件,在页面前端添加新的用户,我们将会添加一个CreateUserWizard,用来创建用户。
用下面的代码,将用户添加到某个角色。
protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e) { if (RadioButtonList1.SelectedValue == "0") { string username = CreateUserWizard1.UserName; Roles.AddUserToRole(username, "Regular"); } else if (RadioButtonList1.SelectedValue == "1") { string username = CreateUserWizard1.UserName; Roles.AddUserToRole(username, "Premium"); } } |
用Login控件,提供登录接口。
然后在导航部分,通过添加LoginStatus
和LoginName控件来显示登录状态和登录用户的名称。
创建你自己的用户和角色,动手试一下吧。
到目录为止, 我们已经实现了一个最简单的基于角色的权限管理网站, 这个站点利用了ASP.NET提供的验证和授权特性。
源代码: