SlickOne 敏捷開發框架介紹(二) -- 多用戶/多租戶/SAAS軟體基礎框架實現

来源:http://www.cnblogs.com/slickflow/archive/2017/12/05/7867712.html
-Advertisement-
Play Games

前言:在應用於集團版客戶或SAAS平臺服務的業務系統中,流程管理系統需要支持多用戶組織模型。其中包括角色數據、流程定義數據和流程實例數據的多用戶標識綁定。本文旨在全面描述如何基於SlickOne敏捷開發框架實現上述基礎服務功能,形成一個完整的支持多用戶查看和維護各自流程數據的管理後臺系統。 1. 基 ...


前言:在應用於集團版客戶或SAAS平臺服務的業務系統中,流程管理系統需要支持多用戶組織模型。其中包括角色數據、流程定義數據和流程實例數據的多用戶標識綁定。本文旨在全面描述如何基於SlickOne敏捷開發框架實現上述基礎服務功能,形成一個完整的支持多用戶查看和維護各自流程數據的管理後臺系統。

 

1. 基礎數據的多用戶標識

1.1 多用戶(公司)數據表

資料庫表SysCompany用來存儲多用戶/多租戶的基本信息,欄位CompanyID 用來標識後期業務數據的所有者。

1.2 角色/用戶數據表

角色用戶表統一增加CompanyID欄位,用來確定角色和用戶屬於具體的那一個用戶或租戶。

1.3. 流程定義數據的多用戶標識

資料庫表WfProcess增加CompanyID欄位,用來標識流程定義屬於那一個用戶或租戶。

1.4. 流程實例數據的多用戶標識

所有的流程實例數據,統一增加CompanyID欄位,用了標識流程實例數據的擁有者範圍。

2. 多站點類型的SSO功能實現

多站點SSO單點登錄功能的實現,便於統一整合不同子系統的數據管理和維護;尤其對於平臺級別的軟體產品,多個子系統的是需要經常頻繁操作訪問的。所以,一次登錄,再次免驗證,就非常方便簡捷。

2.1 系統環境配置

1) Form 認證方式配置

    <authentication mode="Forms">
      <forms loginUrl="http://localhost/sfadmin/Account/Login" protection="All" timeout="240" name=".AuthCookie" />
    </authentication>

2) Session 狀態存儲配置

    <sessionState mode="InProc" customProvider="DefaultSessionProvider" timeout="480">
      <providers>
        <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
      </providers>
    </sessionState>

3) MachineKey 配置

<machineKey validationKey="zsdgfdg3FF1B0F88DDF585BA5D35E7BC87E3F0AB47FBBEBD12240DD3BEA2BEAEC4ABA215478658ugfjnhgfnmj3F22AD27E8FAD77DCFEE306219691434908D193A17C1FC8DCE51B71A4AE54920" decryptionKey="ECB6A3AF9ABBF3F16E80685ED68DC74B0B13CCEE538EBBA97D0B893139683B3B" validation="SHA256" decryption="AES" />

 

4) 登錄頁面重定向地址

    <add key="FormAuthenticationRedirectUrl" value="http://localhost/sfadmin/Account/Login"/>

 

2.2 Session 對象操作和訪問

 用於服務端用戶對象的身份信息存儲,包括用戶ID標識,用戶名稱,公司ID標識,票據信息和許可權數據等。

 /// <summary>
        /// 獲取登錄用戶ID
        /// </summary>
        /// <param name="session"></param>
        /// <returns></returns>
        public int GetLogonUserID()
        {
            return (int)Get(WEB_LOGON_USER_ID);
        }

        public int GetLogonCompanyID()
        {
            return (int)Get(WEB_LOGON_COMPANY_ID);
        }

        /// <summary>
        /// 獲取登錄用戶Session的GUID
        /// </summary>
        /// <param name="session"></param>
        /// <returns></returns>
        public string GetLogonUserSessionGUID()
        {
            return Get(WEB_LOGON_SESSION_GUID).ToString();
        }

        /// <summary>
        /// 獲取登錄用戶票據
        /// </summary>
        /// <param name="session"></param>
        /// <returns></returns>
        public string GetLogonUserTicket()
        {
            var obj = Get(WEB_LOGON_USER_TICKET);
            var ticket = obj != null ? obj.ToString() : string.Empty;
            return ticket;
        }

 

2.3 Cookie 對象操作和訪問

前端JS腳本訪問用戶的特定信息,通過Cookie對象獲取來實現,大致代碼如下:

function getWebLogonUserCookie() {
        var name = "SlickOneWebLogonUserDataCookie";
        var cookie = getCookie(name);
        if (cookie !== undefined) {
            var userAccount = $.parseJSON(cookie);
            return userAccount;
        } else {
            return null;
        }
    }

    lsm.getWebLogonUserID = function () {
        var userAccount = getWebLogonUserCookie();
        var userID = userAccount.UserID;
        return userID;
    }

    lsm.getWebLogonCompanyID = function () {
        var userAccount = getWebLogonUserCookie();
        if (userAccount !== null) {
            var companyID = userAccount.CompanyID;
            return companyID;
        } else {
            return "";
        }
    }

 

2.4 登錄驗證後的票據存儲

 用戶登錄之後,需要將其基本身份信息和關聯的角色或許可權數據存儲下來。而且作為前後端分離的系統,服務端需要使用這些票據數據,前端也需要通過Cookie對象訪問用戶信息,作為許可權控制的審核來源。

 //create form ticket
            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, loginName, DateTime.Now, DateTime.Now.AddMinutes(240),
                true, userDataContent, FormsAuthentication.FormsCookiePath);

            string ticString = FormsAuthentication.Encrypt(ticket);

            //write cookies in response
            //SetAuthCookie mark identity status true
            HttpContext.Current.Response.Cookies.Add(new HttpCookie("SlickOneWebCookie", ticString));

 

3. Mvc頁面及WebAPI安全訪問

3.1 Mvc頁面授權訪問

頁面控制器統一繼承於頁面基類,基類中重載方法OnActionExecuting(),讀取用戶身份信息,並存儲到Session對象,如果是非授權用戶,則跳轉到登錄頁面。代碼示例如下:

/// <summary>
        /// Authentication Verify When Action Executing
        /// </summary>
        /// <param name="filterContext"></param>
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var attr = filterContext.ActionDescriptor.GetCustomAttributes(typeof(AllowAnonymousAttribute), true);
            bool isAnonymous = attr.Any(a => a is AllowAnonymousAttribute);
            if (isAnonymous == false)
            {
                var session = filterContext.HttpContext.Session;
                this.SessionManager.SetSession(session);

                var user = this.SessionManager.GetLogonUser() as WebLogonUser;
                if (user == null)
                {
                    var webCookie = base.Request.Cookies["SlickOneWebCookie"];
                    if (webCookie != null && !string.IsNullOrEmpty(webCookie.Value))
                    {
                        var encryptTicket = webCookie.Value;
                        SaveUserSession(encryptTicket);
                    }
                    else
                    {
                        //Not a Valid Logon User, Need To Be Login Agagin
                        var formRedirectUrl = WebConfigurationManager.AppSettings["FormAuthenticationRedirectUrl"].ToString();
                        string url = string.Format("{0}?ReturnUrl={1}", formRedirectUrl, Request.RawUrl);
                        filterContext.HttpContext.Response.Redirect(url, true);
                    }
                }
            }
            base.OnActionExecuting(filterContext);
        }

 

3.2 WebAPI 介面安全訪問

 WebAPI控制器增加屬性過濾器,用於驗證是否是授權訪問的介面,其中需要從Cookie中讀取票據信息,驗證審核用戶是否是合法授權用戶。

/// <summary>
        /// check authorizaton information when action executing
        /// </summary>
        /// <param name="actionContext"></param>
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            //get authentication cookie from request
            var authCookie = actionContext.Request.GetCookie("SlickOneWebCookie");
            if (!String.IsNullOrEmpty(authCookie))
            {
                //decrypted user ticket information
                if (ValidateUserTicket(authCookie))
                    base.OnActionExecuting(actionContext);
                else
                    actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
            }
            else
            {
                //verify webapi security setting
                bool isRquired = (WebConfigurationManager.AppSettings["WebApiSecurityEnabled"].ToString() == "true");
                if (isRquired)
                {
                    //check anonymous attribute
                    var attr = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().OfType<AllowAnonymousAttribute>();
                    bool isAnonymous = attr.Any(a => a is AllowAnonymousAttribute);

                    if (isAnonymous)
                        base.OnActionExecuting(actionContext);
                    else
                        actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
                }
                else
                {
                    base.OnActionExecuting(actionContext);
                }
            }
        }

 4. 主界面操作說明

 主界面是整個後臺數據維護的入口頁面,集成了用戶基礎數據、流程數據、表單數據和其它設置頁面。其中流程定義,表單定義都鏈接到不同的WEB應用程式地址,這些WEB應用程式統一實現SSO要求的FORM認證,統一登錄地址等特性。保證一次登錄,再次免驗證就能訪問各子系統的簡捷操作。

 

5. 總結

SlickOne敏捷框架的示例項目,主要包括了基礎數據的維護,業務系統集成訪問,SSO單點登錄實現,MVC頁面安全和WebAPI安全訪問等功能特性。作為企業級應用系統的開發,可以完全擔當軟體團隊的技術統一框架解決方案。在後期的版本中,依然考慮企業用戶的需求,增加和構建功能模塊,做到框架軟體的可擴展和二次開發。

6. 參考

1. SlickOne 敏捷開發框架介紹(一)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 開發C#的程式,寫到屬性property時,我們可以在Set方法中做一些簡單的規則驗證:如下麵,Insus.NET寫一個Age屬性,只允許用戶輸入10以內的數字: class AA { private int _Age; public int Age { get { return _Age; } s ...
  • 本著開發與實施分離的思想,設計一個通用的報表設計窗體顯得尤為重要(下圖為圖一): 要求與優點: I、報表設計窗體支持所有單據調用,一種單據支持多個列印模板。 II、報表模板存儲在資料庫中。一是支持客戶端設計及保存模板,二是一次修改所有客戶端生效。 III、點擊保存是將模板保存在資料庫中,點擊另存為可 ...
  • 周日外出去玩,出行方式有步行,騎行,公車。每個人因人或環境等等因素而選擇的方式有所不同。簡單工廠是符合此類型的。只有在運行時,才知道使用的哪種方法。創建一個抽象類Base: public abstract class Base { public abstract string Mode(); } 下 ...
  • 一、WCF服務應用程式與WCF服務庫 我們在平時開發的過程中常用的項目類型有“WCF 服務應用程式”和“WCF服務庫”。 WCF服務應用程式,是一個可以執行的程式,它有獨立的進程,WCF服務類契約的定義,可以直接看到運行的效果。此項目模板基於IIS托管的程式,如本系列的第一節所示。在開發基於IIS托 ...
  • (一)搭建Spring.NET環境常見的DLL 1.spring.core --整個框架的基礎,實現了依賴註入的功能 2.Spring.AOP--提供面向方面編程(aop)的支持 3.Spring.Data--a定義了一個抽象的數據訪問層,可以跨越各種數據訪問技術(從ADO.NET到各種orm)進行 ...
  • mysql安裝後服務啟動不了 1.1 前言 最近真的是倒霉到家,裝個mysql都能把所有的問題給問候了一遍······不過這也是一個寶貴的經驗,得好好總結下,畢竟也不知道以後會不會再次遇到。如果有網友也能像我這樣倒霉,但是能夠幸運地看到我這個文章,並且真正解決問題,那我就欣慰了。 1.2 我的倒霉過 ...
  • 我想寫一個簡單的系列文章。主題很簡單,就是記錄下麵對上傳視頻需求時,攻城獅和普通人(泛指所有非技術人員)的一些區別。當然,從需求分析到最終完整實現,每個步驟都是有乾貨。我會儘量避免一些偏情緒化的表述。更多的時候,我們應該把註意力集中在各個需求點本身的技術實現上。 這個系列的主要目的,就是秀一下我們... ...
  • 上一篇: "Docker 三劍客之 Docker Compose" 閱讀目錄: Docker Machine 創建 Docker 主機 Docker Swarm 配置集群節點 Docker Service 部署單個集群服務 Docker Stack 部署多個集群服務,以及 GUI 管理頁面 dock ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...