PageRenderTime 44ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/App_Code/Account/KeyAuthentication.cs

https://github.com/mailekah/AgapeConnect1
C# | 464 lines | 358 code | 98 blank | 8 comment | 36 complexity | 82a55702fb265af8742946f24298c2c3 MD5 | raw file
Possible License(s): BSD-3-Clause, Apache-2.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Text;
  7. using System.Xml;
  8. using HtmlAgilityPack;
  9. using System.Web;
  10. namespace KeyUser
  11. {
  12. public class KeyAuthentication
  13. {
  14. #region Constructor
  15. public KeyAuthentication(string username, string password, string targetService = "", string server = "https://thekey.me/cas/")
  16. {
  17. _username = username;
  18. _password = password;
  19. _keyGuid = string.Empty;
  20. _targetService = targetService;
  21. _server = server;
  22. GetProxyTicket();
  23. }
  24. #endregion //Constructor
  25. #region Properties
  26. private string _username;
  27. private string _password;
  28. private string _keyGuid;
  29. private string _tgt;
  30. private string _tgtLocation;
  31. private string _st;
  32. private string _pgtIou;
  33. private string _pgt;
  34. private string _pt;
  35. private string _targetService;
  36. private string _server;
  37. public string server
  38. {
  39. get { return _server; }
  40. }
  41. public string TargetService
  42. {
  43. get { return _targetService; }
  44. }
  45. public string ProxyTicket
  46. {
  47. get { return _pt; }
  48. }
  49. public string ProxyGrantingTicket
  50. {
  51. get { return _pgt; }
  52. }
  53. public string ProxyGrantingTicketIOU
  54. {
  55. get { return _pgtIou; }
  56. }
  57. public string TicketGrantingTicket
  58. {
  59. get { return _tgt; }
  60. }
  61. public string ServiceTicket
  62. {
  63. get { return _st; }
  64. }
  65. public string KeyGuid
  66. {
  67. get { return _keyGuid; }
  68. }
  69. public string Password
  70. {
  71. get { return _password; }
  72. set
  73. {
  74. _password = value;
  75. GetProxyTicket();
  76. }
  77. }
  78. public string UserName
  79. {
  80. get { return _username; }
  81. set
  82. {
  83. _username = value;
  84. GetProxyTicket();
  85. }
  86. }
  87. public List<Exception> _exceptions = new List<Exception>();
  88. #endregion //Properties
  89. #region Methods
  90. private void GetProxyTicket()
  91. {
  92. _tgt = _st = _pgtIou = _pgt = string.Empty;
  93. if (!(string.IsNullOrEmpty(_username) || (string.IsNullOrEmpty(_password))))
  94. {
  95. // string server = "https://thekey.me/cas/";
  96. string restServer = server + "v1/tickets/";
  97. //string service = "http://localhost:13059/Default.aspx";
  98. string service = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path);
  99. //Call theKey REST Api, passing username and password
  100. _tgt = GetTicketGrantingTicket(restServer, service);
  101. if (!string.IsNullOrEmpty(_tgt))
  102. {
  103. _st = GetServiceTicket(service);
  104. if (!string.IsNullOrEmpty(_st))
  105. {
  106. _pgtIou = GetProxyTicketIou(_server, service);
  107. if (!string.IsNullOrEmpty(_pgtIou))
  108. {
  109. _pgt = GetProxyGrantingTicket(_server, restServer, service);
  110. if (!string.IsNullOrEmpty(_pgt) && _targetService!="")
  111. {
  112. _pt = GetProxyTicketFromCAS(_server, _targetService);
  113. }
  114. }
  115. }
  116. }
  117. }
  118. }
  119. private string GetProxyTicketFromCAS(string server, string targetService)
  120. {
  121. string pt = string.Empty;
  122. string validateurl = server + "proxy?targetService=" + targetService + "&pgt=" + _pgt.Trim().ToString();
  123. Stream s;
  124. try
  125. {
  126. WebClient wc = new WebClient();
  127. s = wc.OpenRead(validateurl);
  128. }
  129. catch (Exception e)
  130. {
  131. //Log error
  132. _exceptions.Add(e);
  133. return pt;
  134. }
  135. StreamReader streamReader = new StreamReader(s);
  136. XmlDocument doc = new XmlDocument();
  137. doc.Load(streamReader);
  138. XmlNamespaceManager NamespaceMgr = new XmlNamespaceManager(doc.NameTable);
  139. NamespaceMgr.AddNamespace("cas", "http://www.yale.edu/tp/cas");
  140. XmlNode SuccessNode = doc.SelectSingleNode("/cas:serviceResponse/cas:proxySuccess", NamespaceMgr);
  141. if (!(SuccessNode == null))
  142. {
  143. XmlNode ProxyTicketNode = SuccessNode.SelectSingleNode("./cas:proxyTicket", NamespaceMgr);
  144. if(!(ProxyTicketNode == null))
  145. return ProxyTicketNode.InnerText ;
  146. }
  147. return pt;
  148. }
  149. static public string GetProxyTicketFromCAS(string server, string targetService, string tgt)
  150. {
  151. string pt = string.Empty;
  152. string validateurl = server + "proxy?targetService=" + targetService + "&pgt=" + tgt.Trim().ToString();
  153. Stream s;
  154. try
  155. {
  156. WebClient wc = new WebClient();
  157. s = wc.OpenRead(validateurl);
  158. }
  159. catch (Exception e)
  160. {
  161. //Log error
  162. return pt;
  163. }
  164. StreamReader streamReader = new StreamReader(s);
  165. XmlDocument doc = new XmlDocument();
  166. doc.Load(streamReader);
  167. XmlNamespaceManager NamespaceMgr = new XmlNamespaceManager(doc.NameTable);
  168. NamespaceMgr.AddNamespace("cas", "http://www.yale.edu/tp/cas");
  169. XmlNode SuccessNode = doc.SelectSingleNode("/cas:serviceResponse/cas:proxySuccess", NamespaceMgr);
  170. if (!(SuccessNode == null))
  171. {
  172. XmlNode ProxyTicketNode = SuccessNode.SelectSingleNode("./cas:proxyTicket", NamespaceMgr);
  173. if (!(ProxyTicketNode == null))
  174. return ProxyTicketNode.InnerText;
  175. }
  176. return pt;
  177. }
  178. static public string getProxyTicket(string server, string service, string username, string password)
  179. {
  180. string tgt = string.Empty;
  181. HtmlDocument responseDoc;
  182. string postData = "service=" + service + "&username=" + username + "&password=" + password;
  183. responseDoc = postToCAS(server + "v1/tickets/", postData);
  184. if (responseDoc != null)
  185. {
  186. tgt = parseTGT(responseDoc, server + "v1/tickets/");
  187. }
  188. string pt = GetProxyTicketFromCAS(server, service, tgt);
  189. return pt;
  190. }
  191. private string GetTicketGrantingTicket(string server, string service)
  192. {
  193. string tgt = string.Empty;
  194. HtmlDocument responseDoc;
  195. string postData = "service=" + service + "&username=" + _username + "&password=" + _password;
  196. responseDoc = PostToCAS(server, postData);
  197. if (responseDoc != null)
  198. {
  199. tgt = ParseTGT(responseDoc, server);
  200. }
  201. return tgt;
  202. }
  203. private string GetServiceTicket(string service)
  204. {
  205. string postData = "service=" + service;
  206. HtmlDocument responseDoc;
  207. responseDoc = PostToCAS(_tgtLocation, postData);
  208. if (!string.IsNullOrEmpty(responseDoc.DocumentNode.InnerHtml))
  209. {
  210. return responseDoc.DocumentNode.InnerHtml;
  211. }
  212. else
  213. {
  214. return string.Empty;
  215. }
  216. }
  217. private string GetProxyTicketIou(string server, string service)
  218. {
  219. string pgtIou = string.Empty;
  220. string validateurl = server + "proxyValidate?ticket=" + _st.Trim().ToString()
  221. + "&service=" + service
  222. + "&pgtUrl=https://myagape.org.uk/pgtCallback.aspx";
  223. Stream s;
  224. try
  225. {
  226. WebClient wc = new WebClient();
  227. s = wc.OpenRead(validateurl);
  228. }
  229. catch (Exception e)
  230. {
  231. //Log error
  232. _exceptions.Add(e);
  233. return pgtIou;
  234. }
  235. StreamReader streamReader = new StreamReader(s);
  236. XmlDocument doc = new XmlDocument();
  237. doc.Load(streamReader);
  238. XmlNamespaceManager NamespaceMgr = new XmlNamespaceManager(doc.NameTable);
  239. NamespaceMgr.AddNamespace("cas", "http://www.yale.edu/tp/cas");
  240. //Check for success
  241. XmlNode ServiceResponse = doc.SelectSingleNode("/cas:serviceResponse/cas:authenticationFailure", NamespaceMgr);
  242. if (!(ServiceResponse == null))
  243. {
  244. return pgtIou;
  245. }
  246. XmlNode SuccessNode = doc.SelectSingleNode("/cas:serviceResponse/cas:authenticationSuccess", NamespaceMgr);
  247. if (!(SuccessNode == null))
  248. {
  249. if (!(SuccessNode.SelectSingleNode("./cas:attributes/ssoGuid", NamespaceMgr) == null))
  250. { _keyGuid = SuccessNode.SelectSingleNode("./cas:attributes/ssoGuid", NamespaceMgr).InnerText; }
  251. if (!(SuccessNode.SelectSingleNode("./cas:proxyGrantingTicket", NamespaceMgr) == null))
  252. { pgtIou = SuccessNode.SelectSingleNode("./cas:proxyGrantingTicket", NamespaceMgr).InnerText; }
  253. else { pgtIou = string.Empty; }
  254. }
  255. return pgtIou;
  256. }
  257. private string GetProxyGrantingTicket(string server, string restServer, string service)
  258. {
  259. string returnPgt;
  260. try
  261. {
  262. returnPgt = new theKeyProxyTicket.PGTCallBack().RetrievePGTCallback("CASAUTH", "thecatsaysmeow3", _pgtIou);
  263. }
  264. catch
  265. {
  266. returnPgt = string.Empty;
  267. }
  268. if (string.IsNullOrEmpty(returnPgt))
  269. {
  270. returnPgt = string.Empty;
  271. }
  272. return returnPgt;
  273. }
  274. private string ParseTGT(HtmlDocument responseDoc, string restServer)
  275. {
  276. string returnTgt = string.Empty;
  277. foreach (var item in responseDoc.DocumentNode.SelectSingleNode("/html/body/form").Attributes)
  278. {
  279. if (item.Name == "action")
  280. {
  281. returnTgt = item.Value.Remove(0, (restServer.Length));
  282. }
  283. }
  284. return returnTgt;
  285. }
  286. static private string parseTGT(HtmlDocument responseDoc, string restServer)
  287. {
  288. string returnTgt = string.Empty;
  289. foreach (var item in responseDoc.DocumentNode.SelectSingleNode("/html/body/form").Attributes)
  290. {
  291. if (item.Name == "action")
  292. {
  293. returnTgt = item.Value.Remove(0, (restServer.Length));
  294. }
  295. }
  296. return returnTgt;
  297. }
  298. static private HtmlDocument postToCAS(string restServer, string postData)
  299. {
  300. Stream dataStream;
  301. WebResponse response;
  302. HtmlDocument responseDoc;
  303. WebRequest request = WebRequest.Create(restServer);
  304. byte[] byteArray = Encoding.UTF8.GetBytes(postData);
  305. request.ContentLength = byteArray.Length;
  306. request.Method = "POST";
  307. request.ContentType = "application/x-www-form-urlencoded";
  308. dataStream = request.GetRequestStream();
  309. dataStream.Write(byteArray, 0, byteArray.Length);
  310. dataStream.Close();
  311. try
  312. {
  313. response = request.GetResponse();
  314. dataStream = response.GetResponseStream();
  315. if (string.IsNullOrEmpty(restServer ))
  316. {
  317. restServer = response.Headers.GetValues("Location").ToArray()[0];
  318. }
  319. responseDoc = new HtmlDocument();
  320. responseDoc.Load(dataStream);
  321. dataStream.Close();
  322. response.Close();
  323. }
  324. catch (Exception e)
  325. {
  326. responseDoc = null;
  327. //_exceptions.Add(e);
  328. }
  329. return responseDoc;
  330. }
  331. private HtmlDocument PostToCAS(string restServer, string postData)
  332. {
  333. Stream dataStream;
  334. WebResponse response;
  335. HtmlDocument responseDoc;
  336. WebRequest request = WebRequest.Create(restServer);
  337. byte[] byteArray = Encoding.UTF8.GetBytes(postData);
  338. request.ContentLength = byteArray.Length;
  339. request.Method = "POST";
  340. request.ContentType = "application/x-www-form-urlencoded";
  341. dataStream = request.GetRequestStream();
  342. dataStream.Write(byteArray, 0, byteArray.Length);
  343. dataStream.Close();
  344. try
  345. {
  346. response = request.GetResponse();
  347. dataStream = response.GetResponseStream();
  348. if (string.IsNullOrEmpty(_tgtLocation))
  349. {
  350. _tgtLocation = response.Headers.GetValues("Location").ToArray()[0];
  351. }
  352. responseDoc = new HtmlDocument();
  353. responseDoc.Load(dataStream);
  354. dataStream.Close();
  355. response.Close();
  356. }
  357. catch (Exception e)
  358. {
  359. responseDoc = null;
  360. _exceptions.Add(e);
  361. }
  362. return responseDoc;
  363. }
  364. #endregion //Methods
  365. }
  366. }