| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389 |
- using System;
- using System.Linq;
- using System.Threading.Tasks;
- using System.Web;
- using System.Web.Mvc;
- using Microsoft.AspNet.Identity;
- using Microsoft.AspNet.Identity.Owin;
- using Microsoft.Owin.Security;
- using Winsoft.GOV.XF.WX.Models;
- namespace Winsoft.GOV.XF.WX.Controllers
- {
- [Authorize]
- public class ManageController : Controller
- {
- private ApplicationSignInManager _signInManager;
- private ApplicationUserManager _userManager;
- public ManageController()
- {
- }
- public ManageController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
- {
- UserManager = userManager;
- SignInManager = signInManager;
- }
- public ApplicationSignInManager SignInManager
- {
- get
- {
- return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
- }
- private set
- {
- _signInManager = value;
- }
- }
- public ApplicationUserManager UserManager
- {
- get
- {
- return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
- }
- private set
- {
- _userManager = value;
- }
- }
- //
- // GET: /Manage/Index
- public async Task<ActionResult> Index(ManageMessageId? message)
- {
- ViewBag.StatusMessage =
- message == ManageMessageId.ChangePasswordSuccess ? "已更改你的密码。"
- : message == ManageMessageId.SetPasswordSuccess ? "已设置你的密码。"
- : message == ManageMessageId.SetTwoFactorSuccess ? "已设置你的双重身份验证提供程序。"
- : message == ManageMessageId.Error ? "出现错误。"
- : message == ManageMessageId.AddPhoneSuccess ? "已添加你的电话号码。"
- : message == ManageMessageId.RemovePhoneSuccess ? "已删除你的电话号码。"
- : "";
- var userId = User.Identity.GetUserId();
- var model = new IndexViewModel
- {
- HasPassword = HasPassword(),
- PhoneNumber = await UserManager.GetPhoneNumberAsync(userId),
- TwoFactor = await UserManager.GetTwoFactorEnabledAsync(userId),
- Logins = await UserManager.GetLoginsAsync(userId),
- BrowserRemembered = await AuthenticationManager.TwoFactorBrowserRememberedAsync(userId)
- };
- return View(model);
- }
- //
- // POST: /Manage/RemoveLogin
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task<ActionResult> RemoveLogin(string loginProvider, string providerKey)
- {
- ManageMessageId? message;
- var result = await UserManager.RemoveLoginAsync(User.Identity.GetUserId(), new UserLoginInfo(loginProvider, providerKey));
- if (result.Succeeded)
- {
- var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
- if (user != null)
- {
- await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
- }
- message = ManageMessageId.RemoveLoginSuccess;
- }
- else
- {
- message = ManageMessageId.Error;
- }
- return RedirectToAction("ManageLogins", new { Message = message });
- }
- //
- // GET: /Manage/AddPhoneNumber
- public ActionResult AddPhoneNumber()
- {
- return View();
- }
- //
- // POST: /Manage/AddPhoneNumber
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task<ActionResult> AddPhoneNumber(AddPhoneNumberViewModel model)
- {
- if (!ModelState.IsValid)
- {
- return View(model);
- }
- // 生成令牌并发送该令牌
- var code = await UserManager.GenerateChangePhoneNumberTokenAsync(User.Identity.GetUserId(), model.Number);
- if (UserManager.SmsService != null)
- {
- var message = new IdentityMessage
- {
- Destination = model.Number,
- Body = "你的安全代码是: " + code
- };
- await UserManager.SmsService.SendAsync(message);
- }
- return RedirectToAction("VerifyPhoneNumber", new { PhoneNumber = model.Number });
- }
- //
- // POST: /Manage/EnableTwoFactorAuthentication
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task<ActionResult> EnableTwoFactorAuthentication()
- {
- await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), true);
- var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
- if (user != null)
- {
- await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
- }
- return RedirectToAction("Index", "Manage");
- }
- //
- // POST: /Manage/DisableTwoFactorAuthentication
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task<ActionResult> DisableTwoFactorAuthentication()
- {
- await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), false);
- var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
- if (user != null)
- {
- await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
- }
- return RedirectToAction("Index", "Manage");
- }
- //
- // GET: /Manage/VerifyPhoneNumber
- public async Task<ActionResult> VerifyPhoneNumber(string phoneNumber)
- {
- var code = await UserManager.GenerateChangePhoneNumberTokenAsync(User.Identity.GetUserId(), phoneNumber);
- // 通过 SMS 提供程序发送短信以验证电话号码
- return phoneNumber == null ? View("Error") : View(new VerifyPhoneNumberViewModel { PhoneNumber = phoneNumber });
- }
- //
- // POST: /Manage/VerifyPhoneNumber
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task<ActionResult> VerifyPhoneNumber(VerifyPhoneNumberViewModel model)
- {
- if (!ModelState.IsValid)
- {
- return View(model);
- }
- var result = await UserManager.ChangePhoneNumberAsync(User.Identity.GetUserId(), model.PhoneNumber, model.Code);
- if (result.Succeeded)
- {
- var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
- if (user != null)
- {
- await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
- }
- return RedirectToAction("Index", new { Message = ManageMessageId.AddPhoneSuccess });
- }
- // 如果我们进行到这一步时某个地方出错,则重新显示表单
- ModelState.AddModelError("", "无法验证电话号码");
- return View(model);
- }
- //
- // POST: /Manage/RemovePhoneNumber
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task<ActionResult> RemovePhoneNumber()
- {
- var result = await UserManager.SetPhoneNumberAsync(User.Identity.GetUserId(), null);
- if (!result.Succeeded)
- {
- return RedirectToAction("Index", new { Message = ManageMessageId.Error });
- }
- var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
- if (user != null)
- {
- await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
- }
- return RedirectToAction("Index", new { Message = ManageMessageId.RemovePhoneSuccess });
- }
- //
- // GET: /Manage/ChangePassword
- public ActionResult ChangePassword()
- {
- return View();
- }
- //
- // POST: /Manage/ChangePassword
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task<ActionResult> ChangePassword(ChangePasswordViewModel model)
- {
- if (!ModelState.IsValid)
- {
- return View(model);
- }
- var result = await UserManager.ChangePasswordAsync(User.Identity.GetUserId(), model.OldPassword, model.NewPassword);
- if (result.Succeeded)
- {
- var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
- if (user != null)
- {
- await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
- }
- return RedirectToAction("Index", new { Message = ManageMessageId.ChangePasswordSuccess });
- }
- AddErrors(result);
- return View(model);
- }
- //
- // GET: /Manage/SetPassword
- public ActionResult SetPassword()
- {
- return View();
- }
- //
- // POST: /Manage/SetPassword
- [HttpPost]
- [ValidateAntiForgeryToken]
- public async Task<ActionResult> SetPassword(SetPasswordViewModel model)
- {
- if (ModelState.IsValid)
- {
- var result = await UserManager.AddPasswordAsync(User.Identity.GetUserId(), model.NewPassword);
- if (result.Succeeded)
- {
- var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
- if (user != null)
- {
- await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
- }
- return RedirectToAction("Index", new { Message = ManageMessageId.SetPasswordSuccess });
- }
- AddErrors(result);
- }
- // 如果我们进行到这一步时某个地方出错,则重新显示表单
- return View(model);
- }
- //
- // GET: /Manage/ManageLogins
- public async Task<ActionResult> ManageLogins(ManageMessageId? message)
- {
- ViewBag.StatusMessage =
- message == ManageMessageId.RemoveLoginSuccess ? "已删除外部登录名。"
- : message == ManageMessageId.Error ? "出现错误。"
- : "";
- var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
- if (user == null)
- {
- return View("Error");
- }
- var userLogins = await UserManager.GetLoginsAsync(User.Identity.GetUserId());
- var otherLogins = AuthenticationManager.GetExternalAuthenticationTypes().Where(auth => userLogins.All(ul => auth.AuthenticationType != ul.LoginProvider)).ToList();
- ViewBag.ShowRemoveButton = user.PasswordHash != null || userLogins.Count > 1;
- return View(new ManageLoginsViewModel
- {
- CurrentLogins = userLogins,
- OtherLogins = otherLogins
- });
- }
- //
- // POST: /Manage/LinkLogin
- [HttpPost]
- [ValidateAntiForgeryToken]
- public ActionResult LinkLogin(string provider)
- {
- // 请求重定向至外部登录提供程序,以链接当前用户的登录名
- return new AccountController.ChallengeResult(provider, Url.Action("LinkLoginCallback", "Manage"), User.Identity.GetUserId());
- }
- //
- // GET: /Manage/LinkLoginCallback
- public async Task<ActionResult> LinkLoginCallback()
- {
- var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(XsrfKey, User.Identity.GetUserId());
- if (loginInfo == null)
- {
- return RedirectToAction("ManageLogins", new { Message = ManageMessageId.Error });
- }
- var result = await UserManager.AddLoginAsync(User.Identity.GetUserId(), loginInfo.Login);
- return result.Succeeded ? RedirectToAction("ManageLogins") : RedirectToAction("ManageLogins", new { Message = ManageMessageId.Error });
- }
- protected override void Dispose(bool disposing)
- {
- if (disposing && _userManager != null)
- {
- _userManager.Dispose();
- _userManager = null;
- }
- base.Dispose(disposing);
- }
- #region 帮助程序
- // 用于在添加外部登录名时提供 XSRF 保护
- private const string XsrfKey = "XsrfId";
- private IAuthenticationManager AuthenticationManager
- {
- get
- {
- return HttpContext.GetOwinContext().Authentication;
- }
- }
- private void AddErrors(IdentityResult result)
- {
- foreach (var error in result.Errors)
- {
- ModelState.AddModelError("", error);
- }
- }
- private bool HasPassword()
- {
- var user = UserManager.FindById(User.Identity.GetUserId());
- if (user != null)
- {
- return user.PasswordHash != null;
- }
- return false;
- }
- private bool HasPhoneNumber()
- {
- var user = UserManager.FindById(User.Identity.GetUserId());
- if (user != null)
- {
- return user.PhoneNumber != null;
- }
- return false;
- }
- public enum ManageMessageId
- {
- AddPhoneSuccess,
- ChangePasswordSuccess,
- SetTwoFactorSuccess,
- SetPasswordSuccess,
- RemoveLoginSuccess,
- RemovePhoneSuccess,
- Error
- }
- #endregion
- }
- }
|