现状: 用户一台服务器上有多个 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 系统
统一用户登录界面
用户管理界面
角色管理界面
假设 权限管理系统命名为 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>
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