上午寫了一篇《C#開發中Windows域認證登錄》,然后跟吉日嘎拉溝通了一下,還是把這個Windows AD用戶登錄的功能擴展到DotNet.Business中,重新命名為LDAP方式的登錄,因為需要引用System.DirectoryServices,暫時用不到此功能的朋友,可以exclude此文件(DotNet.Business\WebUtilities\Utilities.LogOnLDAP.cs)。
//----------------------------------------------------------------- // All Rights Reserved , Copyright (C) 2013 , Hairihan TECH, Ltd . //----------------------------------------------------------------- using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Text; using System.Web; using System.Web.Caching; using System.Web.Security; using System.DirectoryServices; using DotNet.Utilities; namespace DotNet.Business { /// <summary> /// LDAP登錄功能相關部分 /// </summary> public partial class Utilities { // LDAP域用戶登錄部分:包括Windows AD域用戶登錄 #region public static BaseUserInfo LogOnByLDAP(string domain, string lDAP, string userName, string password, string permissionCode, bool persistCookie, bool formsAuthentication, out string statusCode, out string statusMessage) /// <summary> /// 驗證LDAP用戶 /// </summary> /// <param name="domain">域</param> /// <param name="lDAP">LDAP</param> /// <param name="userName">域用戶名</param> /// <param name="password">域密碼</param> /// <param name="permissionCode">權限編號</param> /// <param name="persistCookie">是否保存密碼</param> /// <param name="formsAuthentication">表單驗證,是否需要重定位</param> /// <param name="statusCode"></param> /// <param name="statusMessage"></param> /// <returns></returns> public static BaseUserInfo LogOnByLDAP(string domain, string lDAP, string userName, string password, string permissionCode, bool persistCookie, bool formsAuthentication, out string statusCode, out string statusMessage) { DirectoryEntry dirEntry = new DirectoryEntry(); dirEntry.Path = lDAP; dirEntry.Username = domain + "\\" + userName; dirEntry.Password = password; dirEntry.AuthenticationType = AuthenticationTypes.Secure; try { DirectorySearcher dirSearcher = new DirectorySearcher(dirEntry); dirSearcher.Filter = String.Format("(&(objectClass=user)(samAccountName={0}))", userName); System.DirectoryServices.SearchResult result = dirSearcher.FindOne(); if (result != null) { // 統一的登錄服務 DotNetService dotNetService = new DotNetService(); BaseUserInfo userInfo = dotNetService.LogOnService.LogOnByUserName(Utilities.GetUserInfo(), userName, out statusCode, out statusMessage); // 檢查身份 if (statusCode.Equals(Status.OK.ToString())) { userInfo.IPAddress = GetIPAddressId(); bool isAuthorized = true; // 用戶是否有哪個相應的權限 if (!string.IsNullOrEmpty(permissionCode)) { isAuthorized = dotNetService.PermissionService.IsAuthorized(userInfo, permissionCode, null); } // 有相應的權限才可以登錄 if (isAuthorized) { if (persistCookie) { // 相對安全的方式保存登錄狀態 // SaveCookie(userName, password); // 內部單點登錄方式 SaveCookie(userInfo); } else { RemoveUserCookie(); } LogOn(userInfo, formsAuthentication); } else { statusCode = Status.LogOnDeny.ToString(); statusMessage = "訪問被拒絕、您的賬戶沒有后台管理訪問權限。"; } } return userInfo; } else { statusCode = Status.LogOnDeny.ToString(); statusMessage = "應用系統用戶不存在,請聯系管理員。"; return null; } } catch (Exception e) { //Logon failure: unknown user name or bad password. statusCode = Status.LogOnDeny.ToString(); statusMessage = "域服務器返回信息" + e.Message.Replace("\r\n", ""); return null; } } #endregion } }
前端的登錄文件-SigninLDAP.aspx,代碼較多可參考Signin.aspx。
