多web站点统一访问授权管理中心系统项目(源码)

多 asp.net  统一访问授权管理中心系统可行性调研报告

现状: 用户一台服务器上有多个 ASP.NET 应用程序,每一个应用都有独自的访问权限管理模块,这些模块原理基本一样
目的:设计开发一个 “访问权限管理中心系统” ,能够管理所有ASP.NET 应用程序的访问权限,统一用户登录界面,用户登录成功后可访问已授权的全部ASP.NET 应用程序  (单点登录), 对现有的 ASP.NET 应用程序 ,尽量不修改源码
可行方案:

思路:
一个管理中心(asp.net)+ 多个拦截器(class)
管理中心使用  asp.net 自带的  membership  roleManager  profile 存放所有可登录用户 , 所有角色,用户角色关系,此功能可以模仿asp.net 网站管理工具(开源)实现,

管理中心可管理的ASP.NET 应用程序 从 web.config 中 取得
ASP.NET 应用程序的功能列表(功能ID  功能名称 RUL ) , 通过 各个 ASP.NET 应用程序 所提供的 WEBAPI (一个 URL) 获得的json 数据得到
角色和功能的对应关系存放于自建的数据表中

管理中心提供WEBAPI 供 拦截器调用, 获得访问用户的已授权功能 ,获得所有授权用户 , 等。

拦截器: 利用 IHttpModule 开发一个class ,编译成dll ,放入bin 文件夹中,通过web。config 添加到系统中 ,不修改原 ASP.NET 应用程序 代码
拦截器通过管理中心所提供的 webapi 获得访问用户是否拥有此访问页面的授权, 如果未授权,则终止访问

实现方法:

假设  权限管理系统命名为 mymag ,  2个 ASP.NET 应用程序命名为  asp1  asp2 

1  访问权限管理中心系统:
asp.net 系统
统一用户登录界面
用户管理界面
角色管理界面


利用asp.net 自带的  membership  roleManager  profile  模块能够配置多应用适配器的功能很容易实现多应用程序的用户,角色,访问权限的分布存储和统一管理, 对 membership  roleManager  profile  不了解的读者请先查阅相关资料。
web config具体配置
membership  : 

 <membership>
            <providers>
                <clear/>
                <add applicationName="mymag" name="mymag" connectionStringName="DefaultConnection" type="System.Web.Security.SqlMembershipProvider"  enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" />
            </providers>
        </membership>
      
说明: membership 保存所有登录用户信息,所有只需要一个适配器,   applicationName 是访问权限管理中心名称  mymag,name 适配器名称, connectionStringName  数据库连接字符串名称 

roleManager :
 <roleManager enabled="true" defaultProvider="mymag" >
          <providers>
              <clear/>
              <add name="mymag" type="System.Web.Security.SqlRoleProvider" connectionStringName="DefaultConnection" applicationName="mymag"/>
              <add name="asp1" type="System.Web.Security.SqlRoleProvider" connectionStringName="DefaultConnection" applicationName="asp1"/>
              <add name="asp2" type="System.Web.Security.SqlRoleProvider" connectionStringName="DefaultConnection" applicationName="asp2"/>

          </providers>
      </roleManager>

说明:roleManager  用于保存多个asp.net应用程序各自的角色 ,所以需要多个适配器。 applicationName  分别对应 ASP.NET 应用程序名称 ,name 分别对应适配器名称,  connectionStringName  数据库连接字符串名称  因本管理系统数据都存放于一个数据库中,所以和 membership的connectionStringName  一一样。 当然也可以使用多个连接字符串将数据保存到不同数据库中,这也是 membership 系统强大之处。不过 放在一起也没问题,只要 applicationName 正确, 角色就不会混乱。

c# 代码  : 用 Roles.Providers  可以读取所有的  role 适配器,也就是 ASP.NET 应用程序名称 ,Roles.Providers["asp1"]  对象中有很多方法,例如:   .CreateRole 创建用户  GetAllRoles 获取所有用户 , 等

profile :

 <profile enabled="true"  defaultProvider=" mymag"  automaticSaveEnabled="false">
          <providers>
              <clear/>
              <add name="mymag" type=" System.Web.Profile.SqlProfileProvider" connectionStringName="DefaultConnection" applicationName="mymag"/>
      
          </providers>
          <properties>
              <add name="apps" type="System.String[]" allowAnonymous="false"  defaultValue="" readOnly="false"/>
          </properties>
      </profile>

说明: powers  用于存放用户已授权APPNAME
c# 参考代码  :
     
       var p= ProfileBase.Create(username);
       p.SetPropertyValue(" apps", new string[] { "P01", "P02" });
       p.Save();
       var s = P.GetPropertyValue(" apps");

获得webapi 数据参考代码:

   System.Net.WebClient c = new System.Net.WebClient();
              string jsonstr=  c.DownloadString("http://1921.168.0.1/webapi");





拦截器:

创建一个类库项目 ,参考代码:


namespace SecurityManagementCenter
{
    public class Handler : IHttpModule
    {


        public void Init(HttpApplication context)
        {
            context.AuthenticateRequest += new EventHandler(context_BeginRequest);
        }

        void context_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            HttpContext context = application.Context;

          ////在此添加权限验证代码

                context.Response.Write("error " + DateTime.Now.ToString()); //返回错误信息
                application.CompleteRequest();  //终止访问
                return;
            }


将项目编译的DLL放置于个 各个 asp.net程序 bin 目录中
web.config 中 <configuration> 添加 配置节点 如下


经典模式  // 仅 asp.net 访问有效
   <system.web>
    <httpModules>
      <add name="SecurityManagementCenter" type="SecurityManagementCenter.Handler,SecurityManagementCenter"/>
     </httpModules>
  </system.web>

集成模式   // preCondition="managedHandler"  仅 asp.net 访问
 <system.webServer>
        <modules>
            <add name="SecurityManagementCenter" type="SecurityManagementCenter.Handler,SecurityManagementCenter" preCondition="managedHandler" />
        </modules>
    </system.webServer>


并完成一个测试型项目 , 源码地址   https://code.csdn.net/peiyu_peiyu/websecuritymanagementcentersystem


多web站点统一访问授权管理中心系统项目(源码)

上一篇:springmvc+freemarker的简单demo


下一篇:79. 视图里的计算属性——从ASP、JSP、JSF到XPages的“钻石”