C#開發中Windows域認證登錄2(擴展吉日嘎拉GPM系統)


原文地址:http://www.cuiwenyuan.com/shanghai/post/Windows-AD-Logon-Intergrated-into-Jirigala-GPM-DotNet-Business.html

上午寫了一篇《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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM