You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
388 lines
13 KiB
388 lines
13 KiB
using DefenseWeb.Helper;
|
|
using DefenseWeb.Models;
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Linq;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.DirectoryServices;
|
|
using System.DirectoryServices.AccountManagement;
|
|
using System.Linq;
|
|
using System.Web;
|
|
using System.Web.Mvc;
|
|
using System.Web.Security;
|
|
|
|
|
|
namespace DefenseWeb.Controllers
|
|
{
|
|
[Authorize]
|
|
public class AccountController : CustomControllerBase
|
|
{
|
|
List<adUrl> adUrl = new List<adUrl>()
|
|
{
|
|
new adUrl() { name = "台北", url = "192.168.6.128" },
|
|
};
|
|
|
|
|
|
//
|
|
// GET: /Account/Login
|
|
[OutputCache(Duration = 60)]
|
|
[AllowAnonymous]
|
|
public ActionResult Login(string returnUrl)
|
|
{
|
|
SelectList selectList = new SelectList(adUrl, "url", "name");
|
|
ViewBag.adUrl = selectList;
|
|
|
|
if (User.Identity.IsAuthenticated)
|
|
{
|
|
return RedirectToAction("Index", "Home");
|
|
}
|
|
|
|
ViewBag.ReturnUrl = returnUrl;
|
|
|
|
return View();
|
|
}
|
|
|
|
//
|
|
// POST: /Account/Login
|
|
[HttpPost]
|
|
[AllowAnonymous]
|
|
[Obsolete]
|
|
public ActionResult Login(LoginViewModel model, string returnUrl)
|
|
{
|
|
SelectList selectList = new SelectList(adUrl, "url", "name");
|
|
string sMsg = null;
|
|
int iDiffDay = 0;
|
|
|
|
ViewBag.adUrl = selectList;
|
|
|
|
if (!ModelState.IsValid)
|
|
{
|
|
return View(model);
|
|
}
|
|
|
|
#if DEBUG
|
|
var result = IsValidationForAD(model.Domain, model.Username, model.Password, out sMsg, out iDiffDay);
|
|
#else
|
|
var result = IsValidationForAD(model.Domain, model.Username, model.Password ,out sMsg, out iDiffDay);
|
|
#endif
|
|
|
|
if (sMsg != null)
|
|
{
|
|
ModelState.AddModelError("", sMsg);
|
|
return View(model);
|
|
}
|
|
|
|
if (result)
|
|
{
|
|
string url = new ConfigHelper().GetWebConfig("UserInfoUrl");
|
|
var data = CallRemote(url, true);
|
|
var obj = JObject.Parse(data);
|
|
if (obj.GetValue("Success").ToObject<bool>() == true && obj["UserData"].Type == JTokenType.Null)
|
|
{
|
|
ModelState.AddModelError("", "找不到該員工資料/Cannot find this employee profile");
|
|
return View(model);
|
|
}
|
|
else if (obj.GetValue("Success").ToObject<bool>() == false)
|
|
{
|
|
ModelState.AddModelError("", "伺服器發生問題,無法登入/Server problem, unable to log in");
|
|
return View(model);
|
|
}
|
|
|
|
//檢查是否已填寫問卷
|
|
url = new ConfigHelper().GetWebConfig("DepartureUrl");
|
|
var departure_obj = JObject.Parse(CallRemote(url, true));
|
|
|
|
if (departure_obj.GetValue("desc") != null && !string.IsNullOrEmpty(departure_obj.GetValue("desc").ToString()))
|
|
{
|
|
ModelState.AddModelError("", "伺服器發生問題,無法登入/Server problem, unable to log in");
|
|
return View(model);
|
|
}
|
|
|
|
if (!departure_obj.GetValue("Success").ToObject<bool>())
|
|
{
|
|
ModelState.AddModelError("", "已離職人員/Terminated staff");
|
|
return View(model);
|
|
}
|
|
|
|
//檢查是否已填寫問卷
|
|
url = new ConfigHelper().GetWebConfig("ExistSurveyUrl");
|
|
var survey_data = CallRemote(url, true);
|
|
var survey_obj = JObject.Parse(survey_data);
|
|
|
|
if (survey_obj.GetValue("desc") != null && !string.IsNullOrEmpty(survey_obj.GetValue("desc").ToString()))
|
|
{
|
|
ModelState.AddModelError("", "伺服器發生問題,無法登入/Server problem, unable to log in");
|
|
return View(model);
|
|
}
|
|
|
|
if (!survey_obj.GetValue("Success").ToObject<bool>())
|
|
{
|
|
ModelState.AddModelError("", "今天已經填過問卷/Have completed the questionnaire today");
|
|
return View(model);
|
|
}
|
|
|
|
obj["UserData"]["password"] = model.Password;
|
|
obj["UserData"]["domain"] = model.Domain;
|
|
obj["UserData"]["DiffDay"] = iDiffDay;
|
|
|
|
FormsAuthentication.SetAuthCookie(model.Username, true, FormsAuthentication.FormsCookiePath);
|
|
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket
|
|
(
|
|
1, model.Username, DateTime.Now, DateTime.Now.AddMinutes(15), false, obj["UserData"].ToString(), FormsAuthentication.FormsCookiePath);
|
|
|
|
|
|
//將 Ticket 加密
|
|
var encTicket = FormsAuthentication.Encrypt(authTicket);
|
|
|
|
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
|
|
|
|
|
|
return RedirectToLocal(returnUrl);
|
|
}
|
|
else
|
|
{
|
|
ModelState.AddModelError("", "登入嘗試失試。");
|
|
return View(model);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
public static class ADUserProperties
|
|
{
|
|
public const String OBJECTCLASS = "objectClass";
|
|
|
|
public const String CONTAINERNAME = "cn";
|
|
|
|
public const String LASTNAME = "sn";
|
|
|
|
public const String COUNTRYNOTATION = "c";
|
|
|
|
public const String CITY = "l";
|
|
|
|
public const String STATE = "st";
|
|
|
|
public const String TITLE = "title";
|
|
|
|
public const String POSTALCODE = "postalCode";
|
|
|
|
public const String PHYSICALDELIVERYOFFICENAME = "physicalDeliveryOfficeName";
|
|
|
|
public const String FIRSTNAME = "givenName";
|
|
|
|
public const String MIDDLENAME = "initials";
|
|
|
|
public const String DISTINGUISHEDNAME = "distinguishedName";
|
|
|
|
public const String INSTANCETYPE = "instanceType";
|
|
|
|
public const String WHENCREATED = "whenCreated";
|
|
|
|
public const String WHENCHANGED = "whenChanged";
|
|
|
|
public const String DISPLAYNAME = "displayName";
|
|
|
|
public const String USNCREATED = "uSNCreated";
|
|
|
|
public const String MEMBEROF = "memberOf";
|
|
|
|
public const String USNCHANGED = "uSNChanged";
|
|
|
|
public const String COUNTRY = "co";
|
|
|
|
public const String DEPARTMENT = "department";
|
|
|
|
public const String COMPANY = "company";
|
|
|
|
public const String PROXYADDRESSES = "proxyAddresses";
|
|
|
|
public const String STREETADDRESS = "streetAddress";
|
|
|
|
public const String DIRECTREPORTS = "directReports";
|
|
|
|
public const String NAME = "name";
|
|
|
|
public const String OBJECTGUID = "objectGUID";
|
|
|
|
public const String USERACCOUNTCONTROL = "userAccountControl";
|
|
|
|
public const String BADPWDCOUNT = "badPwdCount";
|
|
|
|
public const String CODEPAGE = "codePage";
|
|
|
|
public const String COUNTRYCODE = "countryCode";
|
|
|
|
public const String BADPASSWORDTIME = "badPasswordTime";
|
|
|
|
public const String LASTLOGOFF = "lastLogoff";
|
|
|
|
public const String LASTLOGON = "lastLogon";
|
|
|
|
public const String PWDLASTSET = "pwdLastSet";
|
|
|
|
public const String PRIMARYGROUPID = "primaryGroupID";
|
|
|
|
public const String OBJECTSID = "objectSid";
|
|
|
|
public const String ADMINCOUNT = "adminCount";
|
|
|
|
public const String ACCOUNTEXPIRES = "accountExpires";
|
|
|
|
public const String LOGONCOUNT = "logonCount";
|
|
|
|
public const String LOGINNAME = "sAMAccountName";
|
|
|
|
public const String SAMACCOUNTTYPE = "sAMAccountType";
|
|
|
|
public const String SHOWINADDRESSBOOK = "showInAddressBook";
|
|
|
|
public const String LEGACYEXCHANGEDN = "legacyExchangeDN";
|
|
|
|
public const String USERPRINCIPALNAME = "userPrincipalName";
|
|
|
|
public const String EXTENSION = "ipPhone";
|
|
|
|
public const String SERVICEPRINCIPALNAME = "servicePrincipalName";
|
|
|
|
public const String OBJECTCATEGORY = "objectCategory";
|
|
|
|
public const String DSCOREPROPAGATIONDATA = "dSCorePropagationData";
|
|
|
|
public const String LASTLOGONTIMESTAMP = "lastLogonTimestamp";
|
|
|
|
public const String EMAILADDRESS = "mail";
|
|
|
|
public const String MANAGER = "manager";
|
|
|
|
public const String MOBILE = "mobile";
|
|
|
|
public const String PAGER = "pager";
|
|
|
|
public const String FAX = "facsimileTelephoneNumber";
|
|
|
|
public const String HOMEPHONE = "homePhone";
|
|
|
|
public const String MSEXCHUSERACCOUNTCONTROL = "msExchUserAccountControl";
|
|
|
|
public const String MDBUSEDEFAULTS = "mDBUseDefaults";
|
|
|
|
public const String MSEXCHMAILBOXSECURITYDESCRIPTOR = "msExchMailboxSecurityDescriptor";
|
|
|
|
public const String HOMEMDB = "homeMDB";
|
|
|
|
public const String MSEXCHPOLICIESINCLUDED = "msExchPoliciesIncluded";
|
|
|
|
public const String HOMEMTA = "homeMTA";
|
|
|
|
public const String MSEXCHRECIPIENTTYPEDETAILS = "msExchRecipientTypeDetails";
|
|
|
|
public const String MAILNICKNAME = "mailNickname";
|
|
|
|
public const String MSEXCHHOMESERVERNAME = "msExchHomeServerName";
|
|
|
|
public const String MSEXCHVERSION = "msExchVersion";
|
|
|
|
public const String MSEXCHRECIPIENTDISPLAYTYPE = "msExchRecipientDisplayType";
|
|
|
|
public const String MSEXCHMAILBOXGUID = "msExchMailboxGuid";
|
|
|
|
public const String NTSECURITYDESCRIPTOR = "nTSecurityDescriptor";
|
|
|
|
}
|
|
|
|
|
|
private bool IsValidationForAD(string url, string Username, string Password, out string o_sMsg, out int i_diffDay)
|
|
{
|
|
o_sMsg = null;
|
|
bool isSuccess = false;
|
|
i_diffDay = 0;
|
|
|
|
try
|
|
{
|
|
string srvr = url;
|
|
srvr = "LDAP://" + srvr;
|
|
|
|
|
|
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, url, Username, Password);
|
|
|
|
var user = UserPrincipal.FindByIdentity(ctx, Username);
|
|
|
|
if (user != null)
|
|
{
|
|
DirectoryEntry entry = (DirectoryEntry)user.GetUnderlyingObject();
|
|
|
|
List<string> lsPropName = (from x in typeof(ADUserProperties).GetFields()
|
|
select x.GetValue(typeof(string)).ToString()).ToList();
|
|
|
|
Dictionary<string, object> dicADInfo = new Dictionary<string, object>();
|
|
foreach (string sPropName in lsPropName)
|
|
{
|
|
if (entry.Properties.Contains(sPropName))
|
|
{
|
|
dicADInfo.Add(sPropName, entry.Properties[sPropName].Value);
|
|
}
|
|
}
|
|
|
|
var expiresDate = (DateTime)entry.InvokeGet("PasswordExpirationDate");
|
|
i_diffDay = new TimeSpan(expiresDate.Ticks - DateTime.Now.Ticks).Days;
|
|
|
|
isSuccess = true;//verify password is succeed!
|
|
}
|
|
}
|
|
catch (DirectoryServicesCOMException ex)
|
|
{
|
|
if (ex.ExtendedErrorMessage.IndexOf("data 532,") > -1)
|
|
{
|
|
o_sMsg = @"您的AD 密碼已過期,請使用公司電腦設備到 eip.chipmos.com 網站更新密碼。<a href='http://eip.chipmos.com/' target='_blank'>eip.chipmos.com</a>
|
|
Your AD password has expired. Please go to <a href='http://eip.chipmos.com/' target='_blank'>eip.chipmos.com</a> web site to change your password by using CHIPMOS computer equipment.";
|
|
}
|
|
else
|
|
{
|
|
o_sMsg = ex.Message;
|
|
}
|
|
|
|
Logger.Error(string.Format("sMsg={0},para={1} ex.StackTrace={2}, innerException={3} ", ex.Message, JsonConvert.SerializeObject(new { url = url, Username = Username, Password = Password, msg = ex.ExtendedErrorMessage }), ex.StackTrace, ex.InnerException));
|
|
|
|
}
|
|
return isSuccess;
|
|
}
|
|
private ActionResult RedirectToLocal(string returnUrl)
|
|
{
|
|
|
|
if (Url.IsLocalUrl(returnUrl))
|
|
{
|
|
return Redirect(returnUrl);
|
|
}
|
|
|
|
return RedirectToAction("Index", "Home");
|
|
}
|
|
|
|
//
|
|
// POST: /Account/LogOff
|
|
[HttpPost]
|
|
[ValidateAntiForgeryToken]
|
|
public ActionResult LogOff()
|
|
{
|
|
FormsAuthentication.SignOut();
|
|
return RedirectToAction("Index", "Home");
|
|
}
|
|
|
|
|
|
public ActionResult GetUserData()
|
|
{
|
|
//todo
|
|
return Content(CallRemote(""));
|
|
}
|
|
|
|
|
|
public ActionResult WriteUserData()
|
|
{
|
|
//todo
|
|
// CallRemote("");
|
|
return Content(CallRemote(""));
|
|
}
|
|
|
|
}
|
|
}
|