http://blog.sina.com.cn/s/blog_5067ef490101e1ul.html
protected void Page_Load(object sender, EventArgs e)
{
// 認証処理開始
string staffCode = string.Empty;
if (!CheckUtility.IsEmpty(Request.QueryString[ConstValue.QUERY_STRING_KEY_STFCD]))
{
staffCode = Request.QueryString[ConstValue.QUERY_STRING_KEY_STFCD].ToString();
}
string loginUserID = string.Empty;
if (CheckUtility.IsEmpty(staffCode))
{
// URLパラメータで担当者コードが取得できなかったとき
// ADよりドメイン情報の取得
string[] name = User.Identity.Name.Split('\\');
// ADよりログインユーザのドメイン情報を取得
string loginUserDomain = name[0];
WebLogUtility.WriteDebugLog("ログインアカウント(ドメイン):" + loginUserDomain);
// ADよりログインユーザIDを取得
loginUserID = name[1];
WebLogUtility.WriteDebugLog("ログインアカウント:" + loginUserID);
LdapAuthentication ldap = new LdapAuthentication();
staffCode = ldap.GetEmployee(loginUserDomain, loginUserID);
}
//担当者コード(AD取得)で権限マスタから権限コードを取得
Dictionary<string, object> parameter = new Dictionary<string, object>();
parameter.Add(StaffInfoBll.REQUEST_KEY_STAFF_CODE, staffCode);
ResponseDataType response = new StaffInfoBll().Execute(parameter);
// BLLからの返却値を元にSessionに値を設定
StaffInfo staffInfo = (StaffInfo)response[StaffInfoBll.RESPONSE_KEY_STAFF_INFO];
if (staffInfo == null || CheckUtility.IsEmpty(staffInfo.StfCd))
{
ApplException excep = new ApplException("担当者マスタにユーザーが存在しません。");
excep.LongInUserId = staffCode;
excep.NtAccount = loginUserID;
throw excep;
}
staffInfo.NtUserCd = loginUserID;
staffInfo.Ip = GetClientIPAddress();
Session[ConstValue.SESSION_KEY_STAFF_INFO] = staffInfo;
Session[ConstValue.SESSION_KEY_SYS_STAFF_INFO] = staffInfo;
Session[ConstValue.SESSION_KEY_IS_AUTHENTICATED] = true;
//}
StringBuilder redirectUrl = new StringBuilder();
Dictionary<string, object> redirectKey = new Dictionary<string, object>();
// 遷移先URLの取得
string dispId = (string)Request.QueryString[ConstValue.QUERY_STRING_KEY_DISP_ID];
redirectUrl.Append(this.GetUrl(dispId));
redirectUrl.Append("?");
redirectUrl.Append(Request.QueryString.ToString());
//セッション変数への格納
Session.Add(ConstValue.SESSION_KEY_REDIRECT, redirectKey);
// リダイレクト
Response.Redirect(redirectUrl.ToString());
}
/// <summary> /// IPアドレスの取得 /// </summary> /// <returns></returns> public string GetClientIPAddress() { return Request.ServerVariables["REMOTE_ADDR"]; }
using System; using System.DirectoryServices; using System.Configuration; using Otsuka.Application.Common.Exception; using Otsuka.Application.Common; /// <summary> /// ActiveDirectoryのユーザ情報を取得する /// </summary> public class LdapAuthentication { /// <summary> /// /// </summary> private DirectoryEntry DrEntry; /// <summary> /// ドメイン名 /// </summary> private string _domainName; /// <summary> /// ユーザ /// </summary> private string _userName; /// <summary> /// パスワード /// </summary> private string _password; /// <summary> /// サーバ /// </summary> private string _serverName; //第1引き数に、ユーザドメイン名を追加 /// <summary> /// ユーザの所属するドメイン名 /// </summary> private string _userDomainName; /// <summary> /// コンストラクタ /// </summary> public LdapAuthentication() { } /// <summary> /// 接続したディレクトリのユーザ情報を取得 /// </summary> /// <param name="domainName">担当者のドメイン名</param> /// <param name="account">取得したい担当者のアカウント</param> /// <returns>担当者コード</returns> public string GetEmployee(string domainName, string account) { this._domainName = ConfigurationManager.AppSettings[ConstValue.DC_DomainName].ToString(); this._userName = ConfigurationManager.AppSettings[ConstValue.DC_UserName].ToString(); this._password = ConfigurationManager.AppSettings[ConstValue.DC_Password].ToString(); this._serverName = ConfigurationManager.AppSettings[ConstValue.DC_ServerName].ToString(); //Web.Configから担当者のドメインと一致するLDAP_DNを取得 if (ConfigurationManager.AppSettings["DC_LdapDn_" + domainName.ToLower()] != null) { _userDomainName = ConfigurationManager.AppSettings["DC_LdapDn_" + domainName.ToLower()].ToString(); _userDomainName = _userDomainName.ToLower(); } //AD接続確認 if (!AccessAD()) { throw new UserNotFoundException("", "", _userName); } //ユーザ情報取得 DirectorySearcher searcher = new DirectorySearcher(); searcher.SearchRoot = DrEntry; searcher.Filter = "(SAMAccountName=" + account + ")"; SearchResult result = searcher.FindOne(); // アカウントが存在しない場合 // アカウントのイニシャル項目に値が設定されていない場合 if (result == null || result.Properties["Initials"].Count.Equals(0)) { throw new UserNotFoundException("", "", account); } return result.Properties["Initials"][0].ToString(); } /// <summary> /// ディレクトリへの接続確認 /// </summary> /// <returns>true:接続可能、false:接続不可</returns> private bool AccessAD() { // アクセスするための情報を作成 string domainAndUsername = _domainName + @"\" + _userName; string[] servers = _serverName.Split(','); foreach (string server in servers) { string LDAP = "LDAP://" + server; //====== 2010/02/26 [CLドメイン対応] ADD START ========= //呼出字にユーザドメイン名を追加 if (!String.IsNullOrEmpty(_userDomainName)) { LDAP = LDAP + "/" + _userDomainName; } //====== 2010/02/26 [CLドメイン対応] ADD END ========= DrEntry = new DirectoryEntry(LDAP, domainAndUsername, _password); try { object navi = DrEntry.NativeObject; return true; } catch { continue; } } return false; } }