利用ASP.NET框架创建网站登陆
|
进入本贴讨论:http://www.bc-cn.net/bbs/dispbbs.asp?BoardID=113&ID=67635 本来标题应当是,利用.NET框架创作安全性网站。
另外还有一个方法:Web.Security.FormsAuthentication.RedirectFromLoginPage(string UserName, bool);将发送Cookie,并且根据传递的ReturnUrl参数来跳转到指定的页面(相当于将上面的两个步骤合为一步)。因此login.aspx隐含可以传递ReturnUrl,如果没有这个参数,这个方法将用户跳转到Default.aspx页。 3、授权资源的访问 一旦验证了用户合法,接下来要做的事就是对于用户请求的资源,授权他们是否能够访问。重新回到web.config文件中,在网站的任何目录中都可以使用web.config,他们的设置是传递继承的。 例如在users目录中存放的均是当用户登录后才能访问的页面,则在这个目录中创建一个web.config文件,内容如下: <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.web> <!-- 授权 此节设置应用程序的授权策略。可以允许或拒绝不同的用户或角色访问 应用程序资源。通配符: "*" 表示任何人,"?" 表示匿名 (未经身份验证的)用户。 --> <authorization> <deny users="?" /> </authorization> </system.web> </configuration> 上述内容中deny users="?" 将告诉.NET,此目录拒绝匿名用户的访问,也就是没有验证的用户。当用户试图请求此目录中的资源,将会被重新定向到login.aspx页面,要求登陆。没有登陆的情况下是无法访问的。 上述仅对目录进行定义,程序员不用在页面上添加任何代码,即可完整地实现了授权方案。 当然,这种仅针对目录的授权配置可能有时候又会缺乏灵活,因此,.NET也提供location配置节,可以对指定的资源定义授权: <configuration> <location path="userabc.aspx"> <system.web> <authorization> <allow users="a,b,c" /> </authorization> </system.web> </location> </configuration> 其中path是资源相对路径。 如果这还不够灵活的话,.NET也提供了在代码中使用的方法,ASP.NET页全局隐含了一个只读的User对象,通过获取User.Identity.IsAuthenticated属性,可探知用户是否验证(即是否登陆),User.Identity.Name属性可以获得用户的Name,即在验证时的SetAuthCookie方法中传递的userid。 4、基于角色的授权 上面我们讲述的用户验证,只可能有两种情况,要么用户通过验证,可以授权访问资源,要么用户没有通过验证,不能访问需要授权的资源。但是即便是验证通过的用户,可能他们所持用的权限还需要再进一步区分。例如普通用户和管理员同样是需要验证通过的,但是普通用户显然不能够访问管理页面,而管理员可以。面对这种情况,.NET可以使用基于角色的授权模型。 其基本原理是,一旦用户验证合法,他们就被分配角色,用户可以使一个或者若干和角色,而资源的授权面向角色,这样,针对不同的角色,就可以授予不同的权限,没有某种角色类型的用户试图访问需要这种角色的资源将会被拒绝。 当网站开始接受用户请求时,就伴随着验证,将激发Application_AuthenticateRequest事件,在Global.asax文件中写代码以响应此事件。角色的分配工作就需要再这里进行。 public void Application_AuthenticateRequest(object sender, EventArgs e) { if (this.Request.IsAuthenticated) { //这里简化了操作,可以从数据库中获得角色信息用以构造rolesStrArr数组。作为示例,我们为除了a之外的用户分配了管理员角色 string[] rolesStrArr; if (this.Context.User.Identity.Name == "a") { rolesStrArr = new string[]{"普通用户"}; } else { rolesStrArr = new string[]{"普通用户","管理员"}; } this.Context.User = new System.Security.Principal.GenericPrincipal(this.User.Identity, rolesStrArr); } } 以上代码清晰明了,因此不再赘述。虽然在全局性有User对象,但是只有Context上下文中的User对象是可以写入的,我们调用System.Security.Principal.GenericPrincipal方法,在原有User对象的基础上为其加入角色。角色列表示一个字符串数组。 一旦用户被授予访问角色之后,在web.config中就可以配置针对不同角色的访问。例如在管理员admin目录内 <configuration> <location path="userabc.aspx"> <system.web> <authorization> <allow roles="管理员" /> <deny users="*" /> </authorization> </system.web> </location> </configuration> 上述配置只允许管理员角色才能被授权。资源默认是任何人都访问的,所以要在下面再添加<deny users="*" />表示对任何用户拒绝。 注意,无论对角色或者对用户指定资源的访问,如果对于多个角色或者读个资源,他们之间使用半角逗号隔开。同样,也可以使用上面讲到的方法,对指定的资源进行配置而不是对整个目录。 全局的User对象提供了一个方法IsInRole(string RoleName)方法用来在代码中检测用户是否拥有某种角色。如果他拥有这种角色,将返回true。 后记 .NET提供了完整的安全方面的解决方案,相对于ASP,这是激动人心的一个新特性。只是很多人可能并不能够熟练地运用,而且最痛心的是,很多书籍上甚至并没有这方面的任何描述,甚至连概念都没有。这就让人很怀疑编者的水平了。 首先,还是要在不断的实践过程中去了解和体会.NET,其实最好的老师应当是MSDN,到论坛来发帖的用户,我都尽量建议去查阅MSDN的资料,MSDN除了教给你怎么写代码,其实他教给你的还有非常优秀的思想和整体概念。只要学会使用,没有这些书也可以。从写第一行代码到现在,除了一本启蒙书,其他的资源都是MSDN或者网上找的,还有就是在每次做项目中的心得。尽管现在看来,启蒙书中也没有非常全面地讲述这些东西。 好了,希望大家看到会有所收获。限于我的水平,错误难免,欢迎指正!
源代码网推荐 源代码网供稿. |
