Advertisement
Guest User

Untitled

a guest
Sep 5th, 2017
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 15.82 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 SimBankSite.Models;
  10.  
  11. namespace SimBankSite.Controllers
  12. {
  13.     [Authorize]
  14.     public class ManageController : Controller
  15.     {
  16.         private ApplicationSignInManager _signInManager;
  17.         private ApplicationUserManager _userManager;
  18.  
  19.         public ManageController()
  20.         {
  21.         }
  22.  
  23.         public ManageController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
  24.         {
  25.             UserManager = userManager;
  26.             SignInManager = signInManager;
  27.         }
  28.  
  29.         public ApplicationSignInManager SignInManager
  30.         {
  31.             get
  32.             {
  33.                 return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
  34.             }
  35.             private set
  36.             {
  37.                 _signInManager = value;
  38.             }
  39.         }
  40.  
  41.         public ApplicationUserManager UserManager
  42.         {
  43.             get
  44.             {
  45.                 return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
  46.             }
  47.             private set
  48.             {
  49.                 _userManager = value;
  50.             }
  51.         }
  52.  
  53.         //
  54.         // GET: /Manage/Index
  55.         public async Task<ActionResult> Index(ManageMessageId? message)
  56.         {
  57.             ViewBag.StatusMessage =
  58.                 message == ManageMessageId.ChangePasswordSuccess ? "Ваш пароль изменен."
  59.                 : message == ManageMessageId.SetPasswordSuccess ? "Пароль задан."
  60.                 : message == ManageMessageId.SetTwoFactorSuccess ? "Настроен поставщик двухфакторной проверки подлинности."
  61.                 : message == ManageMessageId.Error ? "Произошла ошибка."
  62.                 : message == ManageMessageId.AddPhoneSuccess ? "Ваш номер телефона добавлен."
  63.                 : message == ManageMessageId.RemovePhoneSuccess ? "Ваш номер телефона удален."
  64.                 : "";
  65.  
  66.             var userId = User.Identity.GetUserId();
  67.             var model = new IndexViewModel
  68.             {
  69.                 HasPassword = HasPassword(),
  70.                 PhoneNumber = await UserManager.GetPhoneNumberAsync(userId),
  71.                 TwoFactor = await UserManager.GetTwoFactorEnabledAsync(userId),
  72.                 Logins = await UserManager.GetLoginsAsync(userId),
  73.                 BrowserRemembered = await AuthenticationManager.TwoFactorBrowserRememberedAsync(userId),
  74.                 User = await UserManager.FindByIdAsync(userId)
  75.             };
  76.             return View(model);
  77.         }
  78.  
  79.         //
  80.         // POST: /Manage/RemoveLogin
  81.         [HttpPost]
  82.         [ValidateAntiForgeryToken]
  83.         public async Task<ActionResult> RemoveLogin(string loginProvider, string providerKey)
  84.         {
  85.             ManageMessageId? message;
  86.             var result = await UserManager.RemoveLoginAsync(User.Identity.GetUserId(), new UserLoginInfo(loginProvider, providerKey));
  87.             if (result.Succeeded)
  88.             {
  89.                 var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
  90.                 if (user != null)
  91.                 {
  92.                     await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
  93.                 }
  94.                 message = ManageMessageId.RemoveLoginSuccess;
  95.             }
  96.             else
  97.             {
  98.                 message = ManageMessageId.Error;
  99.             }
  100.             return RedirectToAction("ManageLogins", new { Message = message });
  101.         }
  102.  
  103.         //
  104.         // GET: /Manage/AddPhoneNumber
  105.         public ActionResult AddPhoneNumber()
  106.         {
  107.             return View();
  108.         }
  109.  
  110.         //
  111.         // POST: /Manage/AddPhoneNumber
  112.         [HttpPost]
  113.         [ValidateAntiForgeryToken]
  114.         public async Task<ActionResult> AddPhoneNumber(AddPhoneNumberViewModel model)
  115.         {
  116.             if (!ModelState.IsValid)
  117.             {
  118.                 return View(model);
  119.             }
  120.             // Создание и отправка маркера
  121.             var code = await UserManager.GenerateChangePhoneNumberTokenAsync(User.Identity.GetUserId(), model.Number);
  122.             if (UserManager.SmsService != null)
  123.             {
  124.                 var message = new IdentityMessage
  125.                 {
  126.                     Destination = model.Number,
  127.                     Body = "Ваш код безопасности: " + code
  128.                 };
  129.                 await UserManager.SmsService.SendAsync(message);
  130.             }
  131.             return RedirectToAction("VerifyPhoneNumber", new { PhoneNumber = model.Number });
  132.         }
  133.  
  134.         //
  135.         // POST: /Manage/EnableTwoFactorAuthentication
  136.         [HttpPost]
  137.         [ValidateAntiForgeryToken]
  138.         public async Task<ActionResult> EnableTwoFactorAuthentication()
  139.         {
  140.             await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), true);
  141.             var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
  142.             if (user != null)
  143.             {
  144.                 await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
  145.             }
  146.             return RedirectToAction("Index", "Manage");
  147.         }
  148.  
  149.         //
  150.         // POST: /Manage/DisableTwoFactorAuthentication
  151.         [HttpPost]
  152.         [ValidateAntiForgeryToken]
  153.         public async Task<ActionResult> DisableTwoFactorAuthentication()
  154.         {
  155.             await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), false);
  156.             var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
  157.             if (user != null)
  158.             {
  159.                 await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
  160.             }
  161.             return RedirectToAction("Index", "Manage");
  162.         }
  163.  
  164.         //
  165.         // GET: /Manage/VerifyPhoneNumber
  166.         public async Task<ActionResult> VerifyPhoneNumber(string phoneNumber)
  167.         {
  168.             var code = await UserManager.GenerateChangePhoneNumberTokenAsync(User.Identity.GetUserId(), phoneNumber);
  169.             // Отправка SMS через поставщик SMS для проверки номера телефона
  170.             return phoneNumber == null ? View("Error") : View(new VerifyPhoneNumberViewModel { PhoneNumber = phoneNumber });
  171.         }
  172.  
  173.         //
  174.         // POST: /Manage/VerifyPhoneNumber
  175.         [HttpPost]
  176.         [ValidateAntiForgeryToken]
  177.         public async Task<ActionResult> VerifyPhoneNumber(VerifyPhoneNumberViewModel model)
  178.         {
  179.             if (!ModelState.IsValid)
  180.             {
  181.                 return View(model);
  182.             }
  183.             var result = await UserManager.ChangePhoneNumberAsync(User.Identity.GetUserId(), model.PhoneNumber, model.Code);
  184.             if (result.Succeeded)
  185.             {
  186.                 var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
  187.                 if (user != null)
  188.                 {
  189.                     await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
  190.                 }
  191.                 return RedirectToAction("Index", new { Message = ManageMessageId.AddPhoneSuccess });
  192.             }
  193.             // Это сообщение означает наличие ошибки; повторное отображение формы
  194.             ModelState.AddModelError("", "Не удалось проверить телефон");
  195.             return View(model);
  196.         }
  197.  
  198.         //
  199.         // POST: /Manage/RemovePhoneNumber
  200.         [HttpPost]
  201.         [ValidateAntiForgeryToken]
  202.         public async Task<ActionResult> RemovePhoneNumber()
  203.         {
  204.             var result = await UserManager.SetPhoneNumberAsync(User.Identity.GetUserId(), null);
  205.             if (!result.Succeeded)
  206.             {
  207.                 return RedirectToAction("Index", new { Message = ManageMessageId.Error });
  208.             }
  209.             var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
  210.             if (user != null)
  211.             {
  212.                 await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
  213.             }
  214.             return RedirectToAction("Index", new { Message = ManageMessageId.RemovePhoneSuccess });
  215.         }
  216.  
  217.         //
  218.         // GET: /Manage/ChangePassword
  219.         public ActionResult ChangePassword()
  220.         {
  221.             return View();
  222.         }
  223.  
  224.         //
  225.         // POST: /Manage/ChangePassword
  226.         [HttpPost]
  227.         [ValidateAntiForgeryToken]
  228.         public async Task<ActionResult> ChangePassword(ChangePasswordViewModel model)
  229.         {
  230.             if (!ModelState.IsValid)
  231.             {
  232.                 return View(model);
  233.             }
  234.             var result = await UserManager.ChangePasswordAsync(User.Identity.GetUserId(), model.OldPassword, model.NewPassword);
  235.             if (result.Succeeded)
  236.             {
  237.                 var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
  238.                 if (user != null)
  239.                 {
  240.                     await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
  241.                 }
  242.                 return RedirectToAction("Index", new { Message = ManageMessageId.ChangePasswordSuccess });
  243.             }
  244.             AddErrors(result);
  245.             return View(model);
  246.         }
  247.  
  248.         //
  249.         // GET: /Manage/SetPassword
  250.         public ActionResult SetPassword()
  251.         {
  252.             return View();
  253.         }
  254.  
  255.         //
  256.         // POST: /Manage/SetPassword
  257.         [HttpPost]
  258.         [ValidateAntiForgeryToken]
  259.         public async Task<ActionResult> SetPassword(SetPasswordViewModel model)
  260.         {
  261.             if (ModelState.IsValid)
  262.             {
  263.                 var result = await UserManager.AddPasswordAsync(User.Identity.GetUserId(), model.NewPassword);
  264.                 if (result.Succeeded)
  265.                 {
  266.                     var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
  267.                     if (user != null)
  268.                     {
  269.                         await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
  270.                     }
  271.                     return RedirectToAction("Index", new { Message = ManageMessageId.SetPasswordSuccess });
  272.                 }
  273.                 AddErrors(result);
  274.             }
  275.  
  276.             // Это сообщение означает наличие ошибки; повторное отображение формы
  277.             return View(model);
  278.         }
  279.  
  280.         //
  281.         // GET: /Manage/ManageLogins
  282.         public async Task<ActionResult> ManageLogins(ManageMessageId? message)
  283.         {
  284.             ViewBag.StatusMessage =
  285.                 message == ManageMessageId.RemoveLoginSuccess ? "Внешнее имя входа удалено."
  286.                 : message == ManageMessageId.Error ? "Произошла ошибка."
  287.                 : "";
  288.             var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
  289.             if (user == null)
  290.             {
  291.                 return View("Error");
  292.             }
  293.             var userLogins = await UserManager.GetLoginsAsync(User.Identity.GetUserId());
  294.             var otherLogins = AuthenticationManager.GetExternalAuthenticationTypes().Where(auth => userLogins.All(ul => auth.AuthenticationType != ul.LoginProvider)).ToList();
  295.             ViewBag.ShowRemoveButton = user.PasswordHash != null || userLogins.Count > 1;
  296.             return View(new ManageLoginsViewModel
  297.             {
  298.                 CurrentLogins = userLogins,
  299.                 OtherLogins = otherLogins
  300.             });
  301.         }
  302.  
  303.         //
  304.         // POST: /Manage/LinkLogin
  305.         [HttpPost]
  306.         [ValidateAntiForgeryToken]
  307.         public ActionResult LinkLogin(string provider)
  308.         {
  309.             // Запрос перенаправления к внешнему поставщику входа для связывания имени входа текущего пользователя
  310.             return new AccountController.ChallengeResult(provider, Url.Action("LinkLoginCallback", "Manage"), User.Identity.GetUserId());
  311.         }
  312.  
  313.         //
  314.         // GET: /Manage/LinkLoginCallback
  315.         public async Task<ActionResult> LinkLoginCallback()
  316.         {
  317.             var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(XsrfKey, User.Identity.GetUserId());
  318.             if (loginInfo == null)
  319.             {
  320.                 return RedirectToAction("ManageLogins", new { Message = ManageMessageId.Error });
  321.             }
  322.             var result = await UserManager.AddLoginAsync(User.Identity.GetUserId(), loginInfo.Login);
  323.             return result.Succeeded ? RedirectToAction("ManageLogins") : RedirectToAction("ManageLogins", new { Message = ManageMessageId.Error });
  324.         }
  325.  
  326.         // Post: /Manage/BalanceAdding
  327.         public ActionResult BalanceAdding()
  328.         {
  329.             return View();
  330.         }
  331.  
  332.         [HttpPost]
  333.         [Authorize]
  334.         [ValidateAntiForgeryToken]
  335.         public ActionResult BalanceAdding(MoneyAddOnBalance a)
  336.         {
  337.             ApplicationUser usera = new ApplicationUser();
  338.             using (ApplicationDbContext db = new ApplicationDbContext())
  339.             {
  340.                 if (usera.UserCredentials == null)
  341.             {
  342.                     usera.UserCredentials = new UserCredential { Id = usera.Id, Money = a.Money };
  343.                     db.UserCredentials.Add(new UserCredential { Id = usera.Id, Money = a.Money });
  344.                     db.SaveChanges();
  345.                
  346.             }
  347.             else
  348.             {
  349.                 usera.UserCredentials.Money += a.Money;
  350.                
  351.             }
  352.             }
  353.             ViewBag.Balance = a.Money.ToString();
  354.             return View();
  355.         }
  356.        
  357.  
  358.         protected override void Dispose(bool disposing)
  359.         {
  360.             if (disposing && _userManager != null)
  361.             {
  362.                 _userManager.Dispose();
  363.                 _userManager = null;
  364.             }
  365.  
  366.             base.Dispose(disposing);
  367.         }
  368.  
  369. #region Вспомогательные приложения
  370.         // Используется для защиты от XSRF-атак при добавлении внешних имен входа
  371.         private const string XsrfKey = "XsrfId";
  372.  
  373.         private IAuthenticationManager AuthenticationManager
  374.         {
  375.             get
  376.             {
  377.                 return HttpContext.GetOwinContext().Authentication;
  378.             }
  379.         }
  380.  
  381.         private void AddErrors(IdentityResult result)
  382.         {
  383.             foreach (var error in result.Errors)
  384.             {
  385.                 ModelState.AddModelError("", error);
  386.             }
  387.         }
  388.  
  389.         private bool HasPassword()
  390.         {
  391.             var user = UserManager.FindById(User.Identity.GetUserId());
  392.             if (user != null)
  393.             {
  394.                 return user.PasswordHash != null;
  395.             }
  396.             return false;
  397.         }
  398.  
  399.         private bool HasPhoneNumber()
  400.         {
  401.             var user = UserManager.FindById(User.Identity.GetUserId());
  402.             if (user != null)
  403.             {
  404.                 return user.PhoneNumber != null;
  405.             }
  406.             return false;
  407.         }
  408.  
  409.         public enum ManageMessageId
  410.         {
  411.             AddPhoneSuccess,
  412.             ChangePasswordSuccess,
  413.             SetTwoFactorSuccess,
  414.             SetPasswordSuccess,
  415.             RemoveLoginSuccess,
  416.             RemovePhoneSuccess,
  417.             Error
  418.         }
  419.  
  420. #endregion
  421.     }
  422. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement