AccountController.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using System;
  2. using System.ComponentModel.DataAnnotations;
  3. using System.Threading.Tasks;
  4. using System.Web.Http;
  5. using Abp.UI;
  6. using Abp.Web.Models;
  7. using Abp.WebApi.Controllers;
  8. using IwbZero.Authorization;
  9. using Microsoft.Extensions.Internal;
  10. using Microsoft.Owin.Security;
  11. using Microsoft.Owin.Security.OAuth;
  12. using ShwasherSys.Authorization;
  13. using ShwasherSys.Authorization.Users;
  14. namespace ShwasherSys.Api.Controllers
  15. {
  16. public class AccountController : AbpApiController
  17. {
  18. public static OAuthBearerAuthenticationOptions OAuthBearerOptions { get; private set; }
  19. private readonly LogInManager _logInManager;
  20. static AccountController()
  21. {
  22. OAuthBearerOptions = new OAuthBearerAuthenticationOptions();
  23. }
  24. public AccountController(LogInManager logInManager)
  25. {
  26. _logInManager = logInManager;
  27. LocalizationSourceName = ShwasherConsts.LocalizationSourceName;
  28. }
  29. [HttpPost]
  30. public async Task<AjaxResponse> Authenticate(LoginModel loginModel)
  31. {
  32. CheckModelState();
  33. var loginResult = await GetLoginResultAsync(
  34. loginModel.UsernameOrEmailAddress,
  35. loginModel.Password
  36. );
  37. var ticket = new AuthenticationTicket(loginResult.Identity, new AuthenticationProperties());
  38. var currentUtc = new SystemClock().UtcNow;
  39. ticket.Properties.IssuedUtc = currentUtc;
  40. ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(30));
  41. return new AjaxResponse(OAuthBearerOptions.AccessTokenFormat.Protect(ticket));
  42. }
  43. private async Task<IwbLoginResult<SysUser>> GetLoginResultAsync(string usernameOrEmailAddress, string password)
  44. {
  45. var loginResult = await _logInManager.LoginAsync(usernameOrEmailAddress, password);
  46. switch (loginResult.Result)
  47. {
  48. case AbpLoginResultType.Success:
  49. return loginResult;
  50. default:
  51. throw CreateExceptionForFailedLoginAttempt(loginResult.Result, usernameOrEmailAddress);
  52. }
  53. }
  54. private Exception CreateExceptionForFailedLoginAttempt(AbpLoginResultType result, string usernameOrEmailAddress)
  55. {
  56. switch (result)
  57. {
  58. case AbpLoginResultType.Success:
  59. return new ApplicationException("Don't call this method with a success result!");
  60. case AbpLoginResultType.InvalidUserNameOrEmailAddress:
  61. case AbpLoginResultType.InvalidPassword:
  62. return new UserFriendlyException(L("LoginFailed"), L("InvalidUserNameOrPassword"));
  63. // case AbpLoginResultType.InvalidTenancyName:
  64. // return new UserFriendlyException(L("LoginFailed"), L("ThereIsNoTenantDefinedWithName{0}", tenancyName));
  65. // case AbpLoginResultType.TenantIsNotActive:
  66. // return new UserFriendlyException(L("LoginFailed"), L("TenantIsNotActive", tenancyName));
  67. case AbpLoginResultType.UserIsNotActive:
  68. return new UserFriendlyException(L("LoginFailed"), L("UserIsNotActiveAndCanNotLogin", usernameOrEmailAddress));
  69. case AbpLoginResultType.UserEmailIsNotConfirmed:
  70. return new UserFriendlyException(L("LoginFailed"), "Your email address is not confirmed. You can not login"); //TODO: localize message
  71. default: //Can not fall to default actually. But other result types can be added in the future and we may forget to handle it
  72. Logger.Warn("Unhandled login fail reason: " + result);
  73. return new UserFriendlyException(L("LoginFailed"));
  74. }
  75. }
  76. protected virtual void CheckModelState()
  77. {
  78. if (!ModelState.IsValid)
  79. {
  80. throw new UserFriendlyException("Invalid request!");
  81. }
  82. }
  83. }
  84. }
  85. namespace ShwasherSys
  86. {
  87. public class LoginModel
  88. {
  89. [Required]
  90. public string UsernameOrEmailAddress { get; set; }
  91. [Required]
  92. public string Password { get; set; }
  93. // public bool RememberMe { get; set; }
  94. //public string TenancyName { get; set; }
  95. }
  96. }