背景介紹
如果你的業(yè)務(wù)站點是基于Asp.Net MVC的,并且你想集成到綜合平臺4.0,
讓平臺管理你的權(quán)限和登錄,甚至是基礎(chǔ)數(shù)據(jù),那么你來對了。
隨著Asp.Net WebForm技術(shù)的淘汰,現(xiàn)在很多站點都采用了微軟MVC模式進行開發(fā),綜合平臺4.0為了更好的支持該種站點的集成,也提供了相應(yīng)的API和方法。
首先分析下兩個實現(xiàn)模式的區(qū)別:
webform模式:httpmodule進行攔截請求,然后判斷授權(quán)和認證
mvc模式:[過濾器]技術(shù),攔截每個服務(wù)請求,進行相關(guān)授權(quán)認證
所以下文都將怎么基于【過濾器】進行相關(guān)的配置和說明??梢允煜は?br> 參考博文之過濾器.
準備環(huán)境
首先在集成前,需要準備下環(huán)境:
1、可以正常訪問的平臺,并且你有管理員權(quán)限
2、你的站點代碼,并且站點可以發(fā)布到平臺所在服務(wù)器
3、你的站點升級到asp.net MVC5版本
4、獲取最新平臺集成依賴程序集(見下圖)

配置文件
為了便于演示,這里我用vs2015新增了一個Web站點(最簡單的ASP.NET MVC),如下結(jié)構(gòu):

當然,一口氣把依賴平臺的程序集全部添加到引用里面。
修改web.config 站點配置:
<configuration>
....省略部分配置...
<configSections>
<sectionGroup name="Supcon.IntegrationPlatform">
<section name="Global" type="System.Configuration.SingleTagSectionHandler" />
</sectionGroup>
</configSections>
<Supcon.IntegrationPlatform>
<Global EnablePrivilegeValidation="true"
UseLibProxy="false"
UseLocalLib="False"
IsDebugMode="false"
Username="2017"
Password="123456"
Server="http://127.0.0.1:8181/MESIP"
AppID="testForMvc" />
</Supcon.IntegrationPlatform>
....省略部分配置...
</configuration>
其中Global內(nèi)節(jié)點解釋:
1、EnablePrivilegeValidation,是否開啟權(quán)限控制,如果設(shè)置為false,那么權(quán)限將不進行驗證,這個功能一般是開發(fā)階段用,默認請設(shè)置為true。
2、IsDebugMode,如果開啟,那么將用底下的Username和Password進行模擬登錄,這個功能一般是開發(fā)階段用,默認請設(shè)置為false。
3、Server,集成平臺的地址,一般人都知道吧。一般都是http://X.X.X.X:Y/MESIP。這里我把平臺部署到了本地的8181端口。
4、AppID,當前應(yīng)用在平臺注冊的子系統(tǒng)編號,后面會講注冊點
修改代碼
配置登錄驗證過濾器,打開全局的Global.asax的后臺代碼,添加全局過濾器:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
//全局過濾器-用于登錄身份驗證
GlobalFilters.Filters.Add(new Supcon.UnifiedPlatform.Framework.Mvc.AuthenticationFilter());
}
}
如上設(shè)置后,意味著全局的頁面和服務(wù)都要進行登錄驗證。
如果有一些頁面和服務(wù)不需要登錄可以訪問,那么在action上添加設(shè)置參數(shù)的過濾器[AuthenticationFilter(false)]。
測試站點內(nèi),我構(gòu)建了一個HomeController,比如里面有個頁面NotNeedLogin,不需要登錄就可以訪問的,配置如下:
/// <summary>
/// 無需登錄即可訪問
/// </summary>
/// <returns></returns>
[AuthenticationFilter(false)]
public ActionResult NotNeedLogin()
{
return View();
}
講完了身份驗證,那么接著配置授權(quán)驗證,比如有些頁面【當然應(yīng)該是大部分】,需要進行功能授權(quán)才能訪問,那么在需要進行權(quán)限控制的頁面action添加過濾器特殊過濾器 [AuthorizationModuleFilter],比如有個頁面叫:NeedRightList,配置如下
[AuthorizationModuleFilter]
public ActionResult NeedRightList()
{
return View();
}
為了演示按鈕權(quán)限,頁面添加腳本(如果無需按鈕權(quán)限,不用添加):
<script type="text/javascript">
var SitePage = {
toolBarList: "@ViewBag.toolBarList",
rightsTools: "@ViewBag.RightToolBarList",
moduleId: "@ViewBag.ModuleId"
}
</script>
除了頁面,asp.net mvc 還有很多服務(wù)需要進行權(quán)限控制,為了區(qū)分和方便控制,我們也新增了一個服務(wù)權(quán)限過濾器,用于過濾權(quán)限 [AuthorizationFunctionFilter]。比如刪除服務(wù):
/// <summary>
/// 刪除功能 需要權(quán)限的按鈕功能
/// </summary>
/// <returns></returns>
[AuthorizationFunctionFilter]
public JsonResult DeleteServer()
{
return Json("Success");
}
這里需要特別說明的是,過濾器AuthorizationFunctionFilter可是設(shè)置一個參數(shù)enforce:bool,其解釋如下:
enforce:false:
非強制該服務(wù)進行權(quán)限驗證, 即:如果該服務(wù)沒用在權(quán)限管理里面注冊,那么這個服務(wù)不會強制進行權(quán)限驗證【也沒法驗證】。
enforce:true:
強制該服務(wù)進行權(quán)限驗證,即:如果該服務(wù)沒用在權(quán)限管理里面注冊,那么視同該權(quán)限當前用戶沒用權(quán)限處理。
完整的HomeController代碼:
namespace UpSimpleMvcDemo.Controllers
{
public class HomeController:Controller
{
/// <summary>
/// 無需登錄即可訪問
/// </summary>
/// <returns></returns>
[AuthenticationFilter(false)]
public ActionResult NotNeedLogin()
{
return View();
}
/// <summary>
/// 登錄即可訪問
/// </summary>
/// <returns></returns>
public ActionResult List()
{
return View();
}
/// <summary>
/// 權(quán)限控制點菜單
/// </summary>
/// <returns></returns>
[AuthorizationModuleFilter]
public ActionResult NeedRightList()
{
return View();
}
/// <summary>
/// 需要權(quán)限的服務(wù)
/// </summary>
/// <returns></returns>
[AuthorizationFunctionFilter]
public JsonResult NeedRigthServer()
{
return Json("Success",JsonRequestBehavior.AllowGet);
}
/// <summary>
/// 刪除功能 需要權(quán)限的按鈕功能
/// </summary>
/// <returns></returns>
[AuthorizationFunctionFilter]
public JsonResult DeleteServer()
{
return Json("Success",JsonRequestBehavior.AllowGet);
}
}
}
注冊功能
好了,站點的代碼和配置修改已經(jīng)結(jié)束,下面介紹下平臺權(quán)限如何注冊系統(tǒng),和配置權(quán)限。
1、注冊應(yīng)用和菜單
當然首先將我們的站點部署到平臺同站點IIS,比如說是我們部署了:http://localhost:8181/UpMvc
打開平臺功能菜單:系統(tǒng)管理--集成設(shè)置-參數(shù)管理 ,添加站點參數(shù):

打開平臺功能菜單:系統(tǒng)管理--基礎(chǔ)數(shù)據(jù)--應(yīng)用管理,新增子系統(tǒng):Mvc集成

備注:這里的編號就是我們在web.config里面注冊的APPID的來源。
添加菜單和菜單內(nèi)部的按鈕服務(wù):


新建角色:mvc角色,并且將角色分配給當前用戶(該功能在:角色管理和業(yè)務(wù)授權(quán),不在累述)。為了演示,我們設(shè)置了如下權(quán)限:

當前用戶有菜單:列表【權(quán)限】頁面權(quán)限,并且還有刪除、修改和新增按鈕,但是其沒有【服務(wù)測試】服務(wù)。
一切配置都結(jié)束了,現(xiàn)在通過菜單打開頁面:列表【權(quán)限】,發(fā)現(xiàn)已經(jīng)可以正常打開了,并且,你可以查看頁面腳本,同時添加了按鈕的id以供控制顯示:

toolBarList:當前頁面所有按鈕ID,rightsTools:當前用戶有權(quán)限的按鈕ID。
接下去怎么控制按鈕權(quán)限,就是各個業(yè)務(wù)系統(tǒng)自己的事情了,這里不再累述,不過如果你的系統(tǒng)是基于MES最新開發(fā)框架的,那么這一切你不需要關(guān)心,toolbar控件已經(jīng)集成了按鈕權(quán)限控制。
同時我們進行以下其他頁面的測試:
1、無需登錄就可訪問的頁面,新打開瀏覽器測試下:http://localhost:8181/UpMvc/Home/NotNeedLogin

2、需要登錄才能訪問的頁面,新打開瀏覽器測試下:
http://localhost:8181/UpMvc/Home/List

3、需要登錄且需要授權(quán)的服務(wù)和需要登錄無需授權(quán)的服務(wù):
為了演示效果,我們修改NeedRightList.cshtml頁面
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script type="text/javascript">
var SitePage = {
toolBarList: "@ViewBag.toolBarList",
rightsTools: "@ViewBag.RightToolBarList",
moduleId: "@ViewBag.ModuleId"
}
function GetSeverDeleteServer() {
$.ajax({
type: 'POST',
dataType: "json",
url: "@Url.Content("~/Home/DeleteServer")",
success: function (ret) {
alert(ret);
}
});
}
function GetSeverNeedRigthServer() {
$.ajax({
type: 'POST',
dataType: "json",
url: "@Url.Content("~/Home/NeedRigthServer")",
success: function (ret) {
alert(ret);
},
error: function (ret) {
alert(ret.responseJSON.Msg);
}
});
}
</script>
<h2>打開我,你已經(jīng)有權(quán)限了</h2>
<a href="#" onclick="GetSeverDeleteServer();">已經(jīng)授權(quán)的服務(wù)DeleteServer</a>
<br />
<a href="#" onclick="GetSeverNeedRigthServer();">為經(jīng)授權(quán)的服務(wù)NeedRigthServer</a>
點擊第一個連接:success
點擊第二個連接:當前功能沒有權(quán)限,無法訪問!
最后共享下示例站點源碼:
https://pan.baidu.com/s/1bpMygt5 密碼:npmq