Advertisement
Guest User

Untitled

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