Advertisement
Guest User

Untitled

a guest
Jul 7th, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.42 KB | None | 0 0
  1. using System;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using Microsoft.AspNet.Identity;
  7. using Microsoft.AspNet.Identity.Owin;
  8. using Microsoft.Owin.Security;
  9. using MyProject.Models;
  10. using MyProject.DAL;
  11.  
  12. namespace MyProject.Controllers
  13. {
  14. [Authorize]
  15. public class ManageController : Controller
  16. {
  17. private EBookContext db = new EBookContext();
  18.  
  19. private ApplicationSignInManager _signInManager;
  20. private ApplicationUserManager _userManager;
  21.  
  22. public ManageController()
  23. {
  24. }
  25.  
  26. public ManageController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
  27. {
  28. UserManager = userManager;
  29. SignInManager = signInManager;
  30. }
  31.  
  32. public ApplicationSignInManager SignInManager
  33. {
  34. get
  35. {
  36. return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
  37. }
  38. private set
  39. {
  40. _signInManager = value;
  41. }
  42. }
  43.  
  44. public ApplicationUserManager UserManager
  45. {
  46. get
  47. {
  48. return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
  49. }
  50. private set
  51. {
  52. _userManager = value;
  53. }
  54. }
  55.  
  56. //
  57. // GET: /Manage/Index
  58. public async Task<ActionResult> Index(ManageMessageId? message)
  59. {
  60. ViewBag.StatusMessage =
  61. message == ManageMessageId.ChangePasswordSuccess ? "Your password has been changed."
  62. : message == ManageMessageId.SetPasswordSuccess ? "Your password has been set."
  63. : message == ManageMessageId.SetTwoFactorSuccess ? "Your two-factor authentication provider has been set."
  64. : message == ManageMessageId.Error ? "An error has occurred."
  65. : message == ManageMessageId.AddPhoneSuccess ? "Your phone number was added."
  66. : message == ManageMessageId.RemovePhoneSuccess ? "Your phone number was removed."
  67. : "";
  68.  
  69. var userId = User.Identity.GetUserId();
  70.  
  71. var model = new IndexViewModel
  72. {
  73.  
  74. HasPassword = HasPassword(),
  75. PhoneNumber = await UserManager.GetPhoneNumberAsync(userId),
  76. TwoFactor = await UserManager.GetTwoFactorEnabledAsync(userId),
  77. Logins = await UserManager.GetLoginsAsync(userId),
  78. BrowserRemembered = await AuthenticationManager.TwoFactorBrowserRememberedAsync(userId)
  79. };
  80.  
  81. var profiles = db.Profiles.Where(p => p.Login.Equals(User.Identity.Name));
  82.  
  83. ViewBag.UserId = profiles.First().ID;
  84.  
  85. return View(model);
  86. }
  87.  
  88. //
  89. // POST: /Manage/RemoveLogin
  90. [HttpPost]
  91. [ValidateAntiForgeryToken]
  92. public async Task<ActionResult> RemoveLogin(string loginProvider, string providerKey)
  93. {
  94. ManageMessageId? message;
  95. var result = await UserManager.RemoveLoginAsync(User.Identity.GetUserId(), new UserLoginInfo(loginProvider, providerKey));
  96. if (result.Succeeded)
  97. {
  98. var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
  99. if (user != null)
  100. {
  101. await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
  102. }
  103. message = ManageMessageId.RemoveLoginSuccess;
  104. }
  105. else
  106. {
  107. message = ManageMessageId.Error;
  108. }
  109. return RedirectToAction("ManageLogins", new { Message = message });
  110. }
  111.  
  112. //
  113. // GET: /Manage/AddPhoneNumber
  114. public ActionResult AddPhoneNumber()
  115. {
  116. return View();
  117. }
  118.  
  119. //
  120. // POST: /Manage/AddPhoneNumber
  121. [HttpPost]
  122. [ValidateAntiForgeryToken]
  123. public async Task<ActionResult> AddPhoneNumber(AddPhoneNumberViewModel model)
  124. {
  125. if (!ModelState.IsValid)
  126. {
  127. return View(model);
  128. }
  129. // Generate the token and send it
  130. var code = await UserManager.GenerateChangePhoneNumberTokenAsync(User.Identity.GetUserId(), model.Number);
  131. if (UserManager.SmsService != null)
  132. {
  133. var message = new IdentityMessage
  134. {
  135. Destination = model.Number,
  136. Body = "Your security code is: " + code
  137. };
  138. await UserManager.SmsService.SendAsync(message);
  139. }
  140. return RedirectToAction("VerifyPhoneNumber", new { PhoneNumber = model.Number });
  141. }
  142.  
  143. //
  144. // POST: /Manage/EnableTwoFactorAuthentication
  145. [HttpPost]
  146. [ValidateAntiForgeryToken]
  147. public async Task<ActionResult> EnableTwoFactorAuthentication()
  148. {
  149. await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), true);
  150. var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
  151. if (user != null)
  152. {
  153. await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
  154. }
  155. return RedirectToAction("Index", "Manage");
  156. }
  157.  
  158. //
  159. // POST: /Manage/DisableTwoFactorAuthentication
  160. [HttpPost]
  161. [ValidateAntiForgeryToken]
  162. public async Task<ActionResult> DisableTwoFactorAuthentication()
  163. {
  164. await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), false);
  165. var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
  166. if (user != null)
  167. {
  168. await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
  169. }
  170. return RedirectToAction("Index", "Manage");
  171. }
  172.  
  173. //
  174. // GET: /Manage/VerifyPhoneNumber
  175. public async Task<ActionResult> VerifyPhoneNumber(string phoneNumber)
  176. {
  177. var code = await UserManager.GenerateChangePhoneNumberTokenAsync(User.Identity.GetUserId(), phoneNumber);
  178. // Send an SMS through the SMS provider to verify the phone number
  179. return phoneNumber == null ? View("Error") : View(new VerifyPhoneNumberViewModel { PhoneNumber = phoneNumber });
  180. }
  181.  
  182. //
  183. // POST: /Manage/VerifyPhoneNumber
  184. [HttpPost]
  185. [ValidateAntiForgeryToken]
  186. public async Task<ActionResult> VerifyPhoneNumber(VerifyPhoneNumberViewModel model)
  187. {
  188. if (!ModelState.IsValid)
  189. {
  190. return View(model);
  191. }
  192. var result = await UserManager.ChangePhoneNumberAsync(User.Identity.GetUserId(), model.PhoneNumber, model.Code);
  193. if (result.Succeeded)
  194. {
  195. var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
  196. if (user != null)
  197. {
  198. await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
  199. }
  200. return RedirectToAction("Index", new { Message = ManageMessageId.AddPhoneSuccess });
  201. }
  202. // If we got this far, something failed, redisplay form
  203. ModelState.AddModelError("", "Failed to verify phone");
  204. return View(model);
  205. }
  206.  
  207. //
  208. // POST: /Manage/RemovePhoneNumber
  209. [HttpPost]
  210. [ValidateAntiForgeryToken]
  211. public async Task<ActionResult> RemovePhoneNumber()
  212. {
  213. var result = await UserManager.SetPhoneNumberAsync(User.Identity.GetUserId(), null);
  214. if (!result.Succeeded)
  215. {
  216. return RedirectToAction("Index", new { Message = ManageMessageId.Error });
  217. }
  218. var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
  219. if (user != null)
  220. {
  221. await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
  222. }
  223. return RedirectToAction("Index", new { Message = ManageMessageId.RemovePhoneSuccess });
  224. }
  225.  
  226. //
  227. // GET: /Manage/ChangePassword
  228. public ActionResult ChangePassword()
  229. {
  230. return View();
  231. }
  232.  
  233. //
  234. // POST: /Manage/ChangePassword
  235. [HttpPost]
  236. [ValidateAntiForgeryToken]
  237. public async Task<ActionResult> ChangePassword(ChangePasswordViewModel model)
  238. {
  239. if (!ModelState.IsValid)
  240. {
  241. return View(model);
  242. }
  243. var result = await UserManager.ChangePasswordAsync(User.Identity.GetUserId(), model.OldPassword, model.NewPassword);
  244. if (result.Succeeded)
  245. {
  246. var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
  247. if (user != null)
  248. {
  249. await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
  250. }
  251. return RedirectToAction("Index", new { Message = ManageMessageId.ChangePasswordSuccess });
  252. }
  253. AddErrors(result);
  254. return View(model);
  255. }
  256.  
  257. //
  258. // GET: /Manage/SetPassword
  259. public ActionResult SetPassword()
  260. {
  261. return View();
  262. }
  263.  
  264. //
  265. // POST: /Manage/SetPassword
  266. [HttpPost]
  267. [ValidateAntiForgeryToken]
  268. public async Task<ActionResult> SetPassword(SetPasswordViewModel model)
  269. {
  270. if (ModelState.IsValid)
  271. {
  272. var result = await UserManager.AddPasswordAsync(User.Identity.GetUserId(), model.NewPassword);
  273. if (result.Succeeded)
  274. {
  275. var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
  276. if (user != null)
  277. {
  278. await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
  279. }
  280. return RedirectToAction("Index", new { Message = ManageMessageId.SetPasswordSuccess });
  281. }
  282. AddErrors(result);
  283. }
  284.  
  285. // If we got this far, something failed, redisplay form
  286. return View(model);
  287. }
  288.  
  289. //
  290. // GET: /Manage/ManageLogins
  291. public async Task<ActionResult> ManageLogins(ManageMessageId? message)
  292. {
  293. ViewBag.StatusMessage =
  294. message == ManageMessageId.RemoveLoginSuccess ? "The external login was removed."
  295. : message == ManageMessageId.Error ? "An error has occurred."
  296. : "";
  297. var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
  298. if (user == null)
  299. {
  300. return View("Error");
  301. }
  302. var userLogins = await UserManager.GetLoginsAsync(User.Identity.GetUserId());
  303. var otherLogins = AuthenticationManager.GetExternalAuthenticationTypes().Where(auth => userLogins.All(ul => auth.AuthenticationType != ul.LoginProvider)).ToList();
  304. ViewBag.ShowRemoveButton = user.PasswordHash != null || userLogins.Count > 1;
  305. return View(new ManageLoginsViewModel
  306. {
  307. CurrentLogins = userLogins,
  308. OtherLogins = otherLogins
  309. });
  310. }
  311.  
  312. //
  313. // POST: /Manage/LinkLogin
  314. [HttpPost]
  315. [ValidateAntiForgeryToken]
  316. public ActionResult LinkLogin(string provider)
  317. {
  318. // Request a redirect to the external login provider to link a login for the current user
  319. return new AccountController.ChallengeResult(provider, Url.Action("LinkLoginCallback", "Manage"), User.Identity.GetUserId());
  320. }
  321.  
  322. //
  323. // GET: /Manage/LinkLoginCallback
  324. public async Task<ActionResult> LinkLoginCallback()
  325. {
  326. var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(XsrfKey, User.Identity.GetUserId());
  327. if (loginInfo == null)
  328. {
  329. return RedirectToAction("ManageLogins", new { Message = ManageMessageId.Error });
  330. }
  331. var result = await UserManager.AddLoginAsync(User.Identity.GetUserId(), loginInfo.Login);
  332. return result.Succeeded ? RedirectToAction("ManageLogins") : RedirectToAction("ManageLogins", new { Message = ManageMessageId.Error });
  333. }
  334.  
  335. protected override void Dispose(bool disposing)
  336. {
  337. if (disposing && _userManager != null)
  338. {
  339. _userManager.Dispose();
  340. _userManager = null;
  341. }
  342.  
  343. base.Dispose(disposing);
  344. }
  345.  
  346. #region Helpers
  347. // Used for XSRF protection when adding external logins
  348. private const string XsrfKey = "XsrfId";
  349.  
  350. private IAuthenticationManager AuthenticationManager
  351. {
  352. get
  353. {
  354. return HttpContext.GetOwinContext().Authentication;
  355. }
  356. }
  357.  
  358. private void AddErrors(IdentityResult result)
  359. {
  360. foreach (var error in result.Errors)
  361. {
  362. ModelState.AddModelError("", error);
  363. }
  364. }
  365.  
  366. private bool HasPassword()
  367. {
  368. var user = UserManager.FindById(User.Identity.GetUserId());
  369. if (user != null)
  370. {
  371. return user.PasswordHash != null;
  372. }
  373. return false;
  374. }
  375.  
  376. private bool HasPhoneNumber()
  377. {
  378. var user = UserManager.FindById(User.Identity.GetUserId());
  379. if (user != null)
  380. {
  381. return user.PhoneNumber != null;
  382. }
  383. return false;
  384. }
  385.  
  386.  
  387.  
  388. public enum ManageMessageId
  389. {
  390. AddPhoneSuccess,
  391. ChangePasswordSuccess,
  392. SetTwoFactorSuccess,
  393. SetPasswordSuccess,
  394. RemoveLoginSuccess,
  395. RemovePhoneSuccess,
  396. Error
  397. }
  398.  
  399. #endregion
  400. }
  401. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement