• Enterprise Library 2.0 Security Application Block


           今天来介绍一下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;
            }


        }

    }

    关于Security Application Block的介绍就说到这里了,有疏忽错误的地方,还请指正,希望对初学者有所帮助!

    Email:pwei013@163.com



  • 相关阅读:
    HDU6808 Go Running(未解决问题
    K
    E
    D
    B
    I
    HDU 2255 奔小康赚大钱 (KM算法模板)
    hdu 1150 Machine Schedule(二分图模板题)
    ACM-ICPC 2018 焦作赛区网络预赛G Give Candies(欧拉降幂)
    ACM-ICPC 2018 焦作赛区网络预赛 L:Poor God Water(杜教BM)
  • 原文地址:https://www.cnblogs.com/pw/p/417085.html
Copyright © 2020-2023  润新知