Enterprise Library 2.0 -- Security Application Block

    技术2022-05-11  11

    今天来介绍一下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;         }     } } <script type="text/javascript"> function pageLoad() { Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(handleInitializeRequest); //Sys.WebForms.PageRequestManager.getInstance().add_endRequest(handleEndRequest); } function handleInitializeRequest(sender, args) { var prm = Sys.WebForms.PageRequestManager.getInstance(); var eid = args.get_postBackElement().id; if (eid.indexOf("DeleteLink")>0) { args.get_postBackElement().innerHTML = " 正在删除..."; } else if (eid.indexOf("btnSubmit")>0) { document.getElementById("AjaxHolder_PostComment_ltSubmitMsg").innerHTML="正在提交..."; document.getElementById("AjaxHolder_PostComment_btnSubmit").disabled = true; } else if(eid.indexOf("refreshList")>0) { document.getElementById("AjaxHolder_PostComment_refreshList").innerHTML=" 正在刷新..."; } } function TempSave(ElementID) { try { CommentsPersistDiv.setAttribute("CommentContent",document.getElementById(ElementID).value); CommentsPersistDiv.save("CommentXMLStore"); } catch(ex) { } } function Restore(ElementID) { CommentsPersistDiv.load("CommentXMLStore"); document.getElementById(ElementID).value=CommentsPersistDiv.getAttribute("CommentContent"); } </script>

    最新回复(0)