跨應用、跨域、跨機器的單點登錄。
1、流程:
a) 用戶直接訪問門戶url,登錄成功后跳轉到默認應用的url。




b) 用戶直接訪問應用url,若未登錄,跳轉到登錄頁面的url,完成登錄后,跳轉回應用url。

c) 用戶已經登錄,用戶直接訪問應用的URL,若該用戶無權限,跳轉到指定的url


判斷是否有url權限的調用方法如下:
[NeedUrlAuthorized] 需要進行Url驗證 (首先會要求需要登錄)
[HttpPost]
public ActionResult User(Friend.Models.User model)





d) 用戶已經登錄,用戶直接訪問用戶有權限的應用url,通過。


2、驗證碼的生成,封裝成一個插件,方便各種加強版本的驗證需要。

//----------------------------------------------------------------- // All Rights Reserved , Copyright (C) 2013 , Hairihan TECH, Ltd. //----------------------------------------------------------------- using System; using System.Data; using System.Data.Common; using System.Collections.Generic; namespace DotNet.Business { using DotNet.Utilities; /// <summary> /// BaseUserManager /// 用戶管理 /// /// 修改紀錄 /// /// 2013.08.17 版本:1.0 JiRiGaLa 用戶登錄后才設置驗證碼、獲取驗證碼等。 /// /// <author> /// <name>JiRiGaLa</name> /// <date>2011.10.17</date> /// </author> /// </summary> public partial class BaseUserManager : BaseManager { #region public int SetVerificationCode(string userId, string verificationCode) 設置驗證碼 /// <summary> /// 設置驗證碼 /// </summary> /// <param name="userId">用戶主鍵</param> /// <param name="verificationCode">驗證碼</param> /// <returns>影響行數</returns> public int SetVerificationCode(string userId, string verificationCode) { int result = 0; if (string.IsNullOrEmpty(userId) && this.UserInfo != null) { userId = this.UserInfo.Id; } string sqlQuery = string.Empty; sqlQuery = " UPDATE " + BaseUserLogOnEntity.TableName + " SET " + BaseUserLogOnEntity.FieldVerificationCode + " = " + DbHelper.GetParameter("VerificationCode") + " WHERE " + BaseUserLogOnEntity.FieldId + " = " + DbHelper.GetParameter("UserId"); List<IDbDataParameter> dbParameters = new List<IDbDataParameter>(); dbParameters.Add(DbHelper.MakeParameter("VerificationCode", verificationCode)); dbParameters.Add(DbHelper.MakeParameter("UserId", userId)); result = DbHelper.ExecuteNonQuery(sqlQuery, dbParameters.ToArray()); return result; } #endregion #region public bool Verify(string userId, string verificationCode) /// <summary> /// 驗證,驗證碼是否正確 /// </summary> /// <param name="userId">用戶主鍵</param> /// <param name="verificationCode">驗證碼</param> /// <returns></returns> public bool Verify(string userId, string verificationCode) { bool result = false; string sqlQuery = string.Empty; // 最后一次登錄時間 sqlQuery = " SELECT COUNT(1)" + " FROM " + BaseUserLogOnEntity.TableName + " WHERE " + BaseUserLogOnEntity.FieldVerificationCode + " = " + DbHelper.GetParameter("VerificationCode") + " AND " + BaseUserLogOnEntity.FieldId + " = " + DbHelper.GetParameter("UserId"); List<IDbDataParameter> dbParameters = new List<IDbDataParameter>(); dbParameters.Add(DbHelper.MakeParameter("VerificationCode", verificationCode)); dbParameters.Add(DbHelper.MakeParameter("UserId", userId)); object exist = DbHelper.ExecuteScalar(sqlQuery, dbParameters.ToArray()); if (exist != null) { if (BaseSystemInfo.OnLineLimit <= int.Parse(exist.ToString())) { result = true; } } return result; } #endregion } }
3、提供遠程訪問接口:用戶信息的訪問;權限信息的訪問。訪問方式可以是Webservice的方式,封裝成一個訪問類,方便別人調用。
//----------------------------------------------------------------------- // <copyright file="FriendFansManager.Auto.cs" company="Hairihan"> // Copyright (c) 2013 , All rights reserved. // </copyright> //----------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using DotNet.Business; namespace Friend { /// <remarks> /// PermissionWebService /// 權限檢查的WebService /// /// 修改紀錄 /// /// 2013.08.17 版本:1.0 JiRiGaLa 更新審核意見。 /// /// 版本:1.0 /// /// <author> /// <name>JiRiGaLa</name> /// <date>2013.08.17</date> /// </author> /// </remarks> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允許使用 ASP.NET AJAX 從腳本中調用此 Web 服務,請取消對下行的注釋。 // [System.Web.Script.Services.ScriptService] public class PermissionService : System.Web.Services.WebService { // 如果當前用戶沒登錄后台的權限 DotNet.Business.PermissionService permissionService = new DotNet.Business.PermissionService(); // 如果當前用戶登錄 // DotNet.Utilities.BaseUserInfo userInfo = Utilities.CheckCookie(HttpContext.Current.Request); public PermissionService() { /* if (userInfo != null && !string.IsNullOrEmpty(userInfo.Code)) { if (!string.IsNullOrEmpty(permissionItemCode)) { bool permissionAdmin = permissionService.IsAuthorizedByUser(userInfo, userInfo.Id, permissionItemCode, string.Empty); if (!permissionAdmin) { throw new Exception("沒有權限訪問。"); } } } else { throw new Exception("沒有權限訪問。"); } */ } #region public bool IsUserInRole(string systemCode, string userId, string roleCode) /// <summary> /// 用戶是否在某個角色里 /// </summary> /// <param name="systemCode">子系統編號</param> /// <param name="userId">用戶主鍵</param> /// <param name="roleCode">角色編號</param> /// <returns>是否在某個角色里</returns> [WebMethod] public bool IsUserInRole(string systemCode, string userId, string roleCode) { // 需要創建個用戶對象 DotNet.Utilities.BaseUserInfo userInfo = new DotNet.Utilities.BaseUserInfo(); // 若沒指定是哪個子系統,默認就是基礎系統 if (string.IsNullOrEmpty(systemCode)) { systemCode = "Base"; } userInfo.SystemCode = systemCode; // 判斷用戶是否在指定的角色里? BaseUserManager userManager = new BaseUserManager(userInfo); return userManager.IsInRoleByCode(userId, roleCode); } #endregion #region public bool IsAuthorized(string systemCode, string userId, string permissionItemCode) /// <summary> /// 對某個模塊、操作是否有權限? /// </summary> /// <param name="systemCode">子系統編號</param> /// <param name="userId">用戶主鍵</param> /// <param name="permissionItemCode">操作權限編號、模塊編號</param> /// <returns>是否擁有操作權限</returns> [WebMethod] public bool IsAuthorized(string systemCode, string userId, string permissionItemCode) { bool returnValue = false; // 需要創建個用戶對象 DotNet.Utilities.BaseUserInfo userInfo = new DotNet.Utilities.BaseUserInfo(); // 若沒指定是哪個子系統,默認就是基礎系統 if (string.IsNullOrEmpty(systemCode)) { systemCode = "Base"; } userInfo.SystemCode = systemCode; // 實時從數據庫判斷權限的調用方法 returnValue = permissionService.IsAuthorizedByUser(userInfo, userId, permissionItemCode, string.Empty); return returnValue; } #endregion #region public bool IsUrlAuthorized(string systemCode, string userId, string url) /// <summary> /// 對某個模塊、操作是否有權限? /// </summary> /// <param name="systemCode">子系統編號</param> /// <param name="userId">用戶主鍵</param> /// <param name="url">按網址授權</param> /// <returns>是否擁有操作權限</returns> [WebMethod] public bool IsUrlAuthorized(string systemCode, string userId, string url) { bool returnValue = false; // 需要創建個用戶對象 DotNet.Utilities.BaseUserInfo userInfo = new DotNet.Utilities.BaseUserInfo(); // 若沒指定是哪個子系統,默認就是基礎系統 if (string.IsNullOrEmpty(systemCode)) { systemCode = "Base"; } userInfo.SystemCode = systemCode; // 實時從數據庫判斷權限的調用方法 returnValue = permissionService.IsUrlAuthorizedByUser(userInfo, userId, url); return returnValue; } #endregion #region public string[] GetUserPermissions(string systemCode, string userId) /// <summary> /// 獲取用戶的所有權限列表 /// </summary> /// <param name="systemCode">子系統編號</param> /// <param name="userId">用戶主鍵</param> /// <returns>權限編號數組</returns> [WebMethod] public string[] GetUserPermissions(string systemCode, string userId) { List<string> permissions = new List<string>(); // 需要創建個用戶對象 DotNet.Utilities.BaseUserInfo userInfo = new DotNet.Utilities.BaseUserInfo(); // 若沒指定是哪個子系統,默認就是基礎系統 if (string.IsNullOrEmpty(systemCode)) { systemCode = "Base"; } userInfo.SystemCode = systemCode; // 獲取用戶的所有權限列表 List<BaseModuleEntity> entityList = permissionService.GetModuleListByUser(userInfo, userId); foreach (var entity in entityList) { // 權限編號 // entity.Code; permissions.Add(entity.Code); // 能訪問的url列表 // entity.NavigateUrl; // entity.FullName; } return permissions.ToArray(); } #endregion } }
A: SSO服務器端配置說明:
1: 附加數據庫,把sql2008數據庫配置好,附加DotNet.CommonV3.9\DotNet.DataBase\SQL2008\UserCenter39
2: 配置 DotNet.Common\Friend, MVC的單點登錄程序,配置數據庫連接Web.config中的UserCenterDbConnection的數據庫連接。
3: 刪除單點登錄的SSO,SSOVerify,SSOPermissionService項目,從Web.config中。
進行以上3個步驟,mvc 的 SSO 服務器端就配置好了,在iis里設置好MVC網站就可以了。
B: SSO 客戶端的配置說明:
1:添加2個dll的引用,DotNet.Business、 DotNet.Utilities,dll在 DotNet.Common\Friend\External 目錄下。
2:Controller 需要加 [NeedAuthorize] 進行單點登錄控制, [NeedUrlAuthorized]進行ul 權限限制。
3:Web.config 中加 SSO,SSOVerify,SSOPermissionService 的配置。
4:添加 PermissionWebService 引用,就是需要引用 上面里的單點登錄 WebService。
5:Global.asax 中需要寫一下 Application_Start() 中的代碼復制過去。
02:MVC 數據庫連接的配置。
03:MVC 用戶名密碼登錄,有錯誤時需要有錯誤提示信息。
04:MVC 里保存密碼的方式,Cokies 保存測試。
05:MVC cookies 保存的時間長度設置,是否啟用cookies。
06:MVC 若有登錄自動跳轉地址的方式。
07:MVC 用OpenId(Key)登錄的方式,登錄跳轉的優化。
08:MVC 多系統支持單點登錄的配置注意事項。
09:MVC 權限判斷的例子。
10:MVC URL 權限判斷的例子。
11:MVC 退出功能的深入優化,能退出子系統也可以退出主系統。