Enterprise Library 2.0 -- Security Application Block

来源:互联网 发布:groovy与java 编辑:程序博客网 时间:2024/06/07 19:05
 今天来介绍一下Enterprise Library 2.0中的Security Application Block ,它可以帮助程序开发者在应用程序中实现与授权有关的大部分功能,不仅如此,它还支持缓存我们系统中用户的授权以及,授权数据。主要包括一下几个部分的功 能:1、减少代码编写量;2、保持应用程序中安全管理的一致性;3、提供了应用程序中很多安全问题的实现方法;4、可扩展,支持自定义Provider。...

       关于Security Application Block的介绍部分,我不再多说,具体可以参考帮助文档。下面我们来看一下如何配置Security Application Block,首先打开配置工具,新建一个Security Application Block,如下:然后在Authorization节点下创建一个Authorization Rule Provider,名称为RuleProvider,如下:现在就可以在RuleProvider节点下,创建一系列的规则(Rule)了。如下图:新建了规则,我们还需要为这个规则定义一个表达式,用于在程序中判断是否满足该规则,如下图:如图所示,我们定义了能通过该规则的用户的身份必须是User或Admin.我们可以根据我们的实际需要定义各种各样的规则。最后我们可以为我们建立的Security Application Block分配一个默认的Authorization实例,如图:此时,我们的配置文件中就多了如下内容:

<section name="securityConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Security.Configuration.SecuritySettings, Microsoft.Practices.EnterpriseLibrary.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" /><securityConfiguration defaultAuthorizationInstance="RuleProvider"    defaultSecurityCacheInstance="">    <authorizationProviders>      <add type="Microsoft.Practices.EnterpriseLibrary.Security.AuthorizationRuleProvider, Microsoft.Practices.EnterpriseLibrary.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"        name="RuleProvider">        <rules>          <add expression="R:User OR R:Admin" name="Rule" />        </rules>      </add>    </authorizationProviders>  </securityConfiguration>

       关于Security Application Block的配置就说到这里。

      下面来看看Enterprise Library 2.0 的Security Application Block 与1.0版本中的一点区别,因为ASP.NET2.0中提供了角色与成员管理的新特性,所以在某些方面和1.0版本还是有一定的区别:    因为ASP.NET2.0提供了MemberShip,Roles两个类,其中包含了验证用户、角色管理以及对Profile信息的设置与读取功能,所以 Security Application Block 2.0将这些功能去掉了。因此和1.0版本的主要区别在于下面三方面:首先导入下面两个命名空间:using System.Web.Profile;using System.Web.Security;1、验证用户的方法如下:

        /**//// <summary>        /// 验证用户        /// http://pw.cnblogs.com        /// </summary>        /// <param name="username">用户名</param>        /// <param name="password">密码</param>        /// <returns></returns>        public bool CheckUser(string username, string password)        {            return Membership.ValidateUser(username, password);        }
2、读取或设置Profile信息
        /**//// <summary>        /// 使用 Profile        /// http://pw.cnblogs.com        /// </summary>        [TestMethod]        public void UseProfile()        {            IIdentity identity;            identity = new GenericIdentity("SHY520", Membership.Provider.Name);            //设置Profile            ProfileBase setuserProfile = ProfileBase.Create(identity.Name);            setuserProfile["Name"= "SHY520";            setuserProfile["Address"= "Wuhu China";            //保存Profile信息            setuserProfile.Save();            //读取Profile信息            ProfileBase readuserProfile = ProfileBase.Create(identity.Name);            string Name = readuserProfile["Name"].ToString();            string Address = readuserProfile["Address"].ToString();            Assert.AreEqual(Name,"SHY520");            Assert.AreEqual(Address,"Wuhu China");        }
3、得到某个用户所属角色列表
        /**//// <summary>        /// 得到某用户所属角色列表        /// http://pw.cnblogs.com        /// </summary>        /// <returns>角色列表</returns>        public string[] GetUserRoles()        {            IIdentity identity = new GenericIdentity("SHY520", Membership.Provider.Name);            return Roles.GetRolesForUser(identity.Name);        }

      与上一个版本的区别基本上就是以上几点,下面我们来看看Security Application Block2.0的基本使用方法:

1、为已授权的用户分配一个Token(记号):       Security Application Block将授权用户的身份信息放进缓存,并返回一个Token,所以我们在使用此方之前需要先配置一个Security Cache,具体方法我就不多说了,可以参考官方教程,下面贴出配置后的App.Config中的代码:

<securityCacheProviders>      <add cacheManagerInstanceName="Cache Manager" defaultSlidingSessionExpirationInMinutes="10"        defaultAbsoluteSessionExpirationInMinutes="60" type="Microsoft.Practices.EnterpriseLibrary.Security.Cache.CachingStore.CachingStoreProvider, Microsoft.Practices.EnterpriseLibrary.Security.Cache.CachingStore, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"        name="Caching Store Provider" /></securityCacheProviders>
这段代码是在securityConfiguration节中的,其中cacheManagerInstanceName是我们在Caching Application Block中配置的实例。
        /**//// <summary>        /// 使用SaveIdentity方法,保存用户身份,并返回一个Token        /// http://pw.cnblogs.com        /// </summary>        /// <returns></returns>        public IToken SaveUserInfo()        {            ISecurityCacheProvider sc = SecurityCacheFactory.GetSecurityCacheProvider("Cache Manager");            //将用户身份装入缓存,并返回一个IToken类型的记号            return sc.SaveIdentity(new GenericIdentity("SHY520"));        }
2、使用Token来验证用户是否已被授权
        /**//// <summary>        /// 根据Token来判断用户是否已被授权        /// http://pw.cnblogs.com        /// </summary>        /// <param name="token"></param>        /// <returns></returns>        public bool CheckUserByToken(IToken token)        {            ISecurityCacheProvider sc = SecurityCacheFactory.GetSecurityCacheProvider("Cache Manager");            //得到Token对应的身份IIdentity            IIdentity savedIdentity = sc.GetIdentity(token);            //返回该身份是否已被授权            return savedIdentity.IsAuthenticated;                    }   
3、结束User Session(即使Token过期)
        /**//// <summary>        /// 使用户Token过期        /// http://pw.cnblogs.com        /// </summary>        public void CloseUserSession()        {            ISecurityCacheProvider sc = SecurityCacheFactory.GetSecurityCacheProvider("Cache Manager");            //保存身份            IToken token = sc.SaveIdentity(new GenericIdentity("SHY520"));            //使身份过期            sc.ExpireIdentity(token);        }
4、判断用户是否满足一定的规则      首先需要导入下面的命名空间: using System.Security; using System.Security.Principal; using Microsoft.Practices.EnterpriseLibrary.Security;
    /**//// <summary>        /// 判断用户是否满足一定的规则        /// http://pw.cnblogs.com        /// </summary>        /// <param name="username">用户名称</param>        /// <param name="role">角色名称</param>        /// <param name="rule">规则名称</param>        /// <returns></returns>        public bool CheckUserRoleByRule(string username, string role, string rule)        {            IPrincipal principal = new GenericPrincipal(new GenericIdentity(username), new string[] { role });            //创建一个默认的Authorization实例            IAuthorizationProvider autoprovider = AuthorizationFactory.GetAuthorizationProvider();            //返回验证是否通过            return autoprovider.Authorize(principal, rule);        }
通过上面的方法可以很简单的实现对用户权限的鉴定,关于Security Application Block的简单应用就说到这里,下面我们来看一下如何实现自定义的authorization provider。1、首先我们建立自己的Provider类,该类需继承AuthorizationProvider;2、并且要加上[ConfigurationElementType(typeof(CustomAuthorizationProviderData))]的Attribute;3、添加构造函数,参数为NameValueCollection类型;4、覆盖基类中的Authorize方法,在其中添加自己的验证是否授权的逻辑这样就完成了一个自定义的authorization provider。完整的类定义如下:
using System;using System.Collections.Generic;using System.Text;using Microsoft.Practices.EnterpriseLibrary.Security;using System.Collections.Specialized;using System.Security.Principal;using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;using Microsoft.Practices.EnterpriseLibrary.Security.Configuration;namespace Enterprise_Library_2{    [ConfigurationElementType(typeof(CustomAuthorizationProviderData))]    public class CustomProvider : AuthorizationProvider    {        public CustomProvider(NameValueCollection configurationItems)        {                    }        public override bool Authorize(IPrincipal principal, string context)        {            //TODO:在此处添加自己需要的验证授权的逻辑既可            return true;        }    }}
原创粉丝点击