IwbAuthorizationServerProvider.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. using System;
  2. using System.Security.Claims;
  3. using System.Threading.Tasks;
  4. using Abp.Dependency;
  5. using Abp.Localization;
  6. using Abp.Localization.Sources;
  7. using WeOnlineApp.Authorization;
  8. using WeOnlineApp.Authorization.Users;
  9. using WeOnlineApp.MultiTenancy;
  10. using IwbZero;
  11. using IwbZero.Authorization.Base;
  12. using IwbZero.Authorization.Users;
  13. using Microsoft.Owin.Security;
  14. using Microsoft.Owin.Security.OAuth;
  15. namespace WeOnlineApp.Api.Providers
  16. {
  17. public class IwbAuthorizationServerProvider : OAuthAuthorizationServerProvider, ITransientDependency
  18. {
  19. private LogInManager LogInManager { get; }
  20. private ILocalizationManager LocalizationManager { get; }
  21. public IwbAuthorizationServerProvider(LogInManager logInManager)
  22. {
  23. LogInManager = logInManager;
  24. LocalizationManager = NullLocalizationManager.Instance;
  25. }
  26. public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
  27. {
  28. if (!context.TryGetBasicCredentials(out var clientId, out var clientSecret))
  29. {
  30. context.TryGetFormCredentials(out clientId, out clientSecret);
  31. }
  32. var isValidClient = string.CompareOrdinal(clientId, "app") == 0 &&
  33. string.CompareOrdinal(clientSecret, "app") == 0;
  34. if (isValidClient)
  35. {
  36. context.OwinContext.Set("as:client_id", clientId);
  37. context.Validated(clientId);
  38. }
  39. else
  40. {
  41. context.SetError("invalid client");
  42. }
  43. return Task.FromResult<object>(null);
  44. }
  45. public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
  46. {
  47. var tenantId = context.Request.Query["tenantId"];
  48. var result = await GetLoginResultAsync(context, context.UserName, context.Password, tenantId);
  49. if (result.Result == IwbLoginResultType.Success)
  50. {
  51. //var claimsIdentity = result.Identity;
  52. var claimsIdentity = new ClaimsIdentity(result.Identity);
  53. claimsIdentity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));
  54. var ticket = new AuthenticationTicket(claimsIdentity, new AuthenticationProperties());
  55. context.Validated(ticket);
  56. }
  57. }
  58. public override Task GrantRefreshToken(OAuthGrantRefreshTokenContext context)
  59. {
  60. var originalClient = context.OwinContext.Get<string>("as:client_id");
  61. var currentClient = context.ClientId;
  62. // enforce client binding of refresh token
  63. if (originalClient != currentClient)
  64. {
  65. context.Rejected();
  66. return Task.FromResult<object>(null);
  67. }
  68. // chance to change authentication ticket for refresh token requests
  69. var newId = new ClaimsIdentity(context.Ticket.Identity);
  70. newId.AddClaim(new Claim("newClaim", "refreshToken"));
  71. var newTicket = new AuthenticationTicket(newId, context.Ticket.Properties);
  72. context.Validated(newTicket);
  73. return Task.FromResult<object>(null);
  74. }
  75. private async Task<IwbLoginResult<Tenant, User>> GetLoginResultAsync(OAuthGrantResourceOwnerCredentialsContext context,
  76. string usernameOrEmailAddress, string password, string tenancyName)
  77. {
  78. var loginResult = await LogInManager.LoginAsync(usernameOrEmailAddress, password, tenancyName);
  79. switch (loginResult.Result)
  80. {
  81. case IwbLoginResultType.Success:
  82. return loginResult;
  83. default:
  84. CreateExceptionForFailedLoginAttempt(context, loginResult.Result, usernameOrEmailAddress, tenancyName);
  85. //throw CreateExceptionForFailedLoginAttempt(context,loginResult.Result, usernameOrEmailAddress, tenancyName);
  86. return loginResult;
  87. }
  88. }
  89. private void CreateExceptionForFailedLoginAttempt(OAuthGrantResourceOwnerCredentialsContext context,
  90. IwbLoginResultType result, string usernameOrEmailAddress, string tenancyName)
  91. {
  92. switch (result)
  93. {
  94. case IwbLoginResultType.Success:
  95. throw new ApplicationException("Don't call this method with a success result!");
  96. case IwbLoginResultType.InvalidUserNameOrEmailAddress:
  97. case IwbLoginResultType.InvalidPassword:
  98. context.SetError(L("LoginFailed"), L("InvalidUserNameOrPassword"));
  99. break;
  100. // return new UserFriendlyException(("LoginFailed"), ("InvalidUserNameOrPassword"));
  101. case IwbLoginResultType.InvalidTenancyName:
  102. context.SetError(L("LoginFailed"), L("ThereIsNoTenantDefinedWithName", tenancyName));
  103. break;
  104. // return new UserFriendlyException(("LoginFailed"), string.Format("ThereIsNoTenantDefinedWithName{0}", tenancyName));
  105. case IwbLoginResultType.TenantIsNotActive:
  106. context.SetError(L("LoginFailed"), L("TenantIsNotActive", tenancyName));
  107. break;
  108. // return new UserFriendlyException(("LoginFailed"), string.Format("TenantIsNotActive {0}", tenancyName));
  109. case IwbLoginResultType.UserIsNotActive:
  110. context.SetError(L("LoginFailed"), L("UserIsNotActiveAndCanNotLogin", usernameOrEmailAddress));
  111. break;
  112. // return new UserFriendlyException(("LoginFailed"), string.Format("UserIsNotActiveAndCanNotLogin {0}", usernameOrEmailAddress));
  113. case IwbLoginResultType.UserEmailIsNotConfirmed:
  114. context.SetError(L("LoginFailed"), L("UserEmailIsNotConfirmedAndCanNotLogin"));
  115. break;
  116. // return new UserFriendlyException(("LoginFailed"), ("UserEmailIsNotConfirmedAndCanNotLogin"));
  117. //default: //Can not fall to default actually. But other result types can be added in the future and we may forget to handle it
  118. // //Logger.Warn("Unhandled login fail reason: " + result);
  119. // return new UserFriendlyException(("LoginFailed"));
  120. }
  121. }
  122. private string L(string name, params object[] args)
  123. {
  124. //return new LocalizedString(name);
  125. return LocalizationManager.GetSource(IwbZeroConsts.LocalizationSourceName).GetString(name, args);
  126. }
  127. }
  128. }