2019-05-28 09:40:37 +00:00
|
|
|
|
using System;
|
|
|
|
|
using ASC.Core;
|
|
|
|
|
using ASC.Core.Tenants;
|
|
|
|
|
using ASC.Core.Users;
|
|
|
|
|
using ASC.Security.Cryptography;
|
|
|
|
|
using ASC.Web.Api.Models;
|
|
|
|
|
using ASC.Web.Api.Routing;
|
2019-11-12 11:32:05 +00:00
|
|
|
|
using ASC.Web.Core;
|
2019-05-28 09:40:37 +00:00
|
|
|
|
using Microsoft.AspNetCore.Authorization;
|
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
2019-10-31 13:54:43 +00:00
|
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
2019-09-26 13:36:53 +00:00
|
|
|
|
using static ASC.Security.Cryptography.EmailValidationKeyProvider;
|
2019-05-28 09:40:37 +00:00
|
|
|
|
|
|
|
|
|
namespace ASC.Web.Api.Controllers
|
|
|
|
|
{
|
|
|
|
|
[DefaultRoute]
|
|
|
|
|
[ApiController]
|
|
|
|
|
[AllowAnonymous]
|
|
|
|
|
public class AuthenticationController : ControllerBase
|
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
public UserManager UserManager { get; }
|
|
|
|
|
public TenantManager TenantManager { get; }
|
|
|
|
|
public SecurityContext SecurityContext { get; }
|
2019-11-08 12:21:51 +00:00
|
|
|
|
public TenantCookieSettingsHelper TenantCookieSettingsHelper { get; }
|
2019-09-27 10:45:37 +00:00
|
|
|
|
public EmailValidationKeyProvider EmailValidationKeyProvider { get; }
|
|
|
|
|
public AuthContext AuthContext { get; }
|
|
|
|
|
public AuthManager AuthManager { get; }
|
2019-11-12 11:32:05 +00:00
|
|
|
|
public CookiesManager CookiesManager { get; }
|
2019-09-09 12:56:33 +00:00
|
|
|
|
|
|
|
|
|
public AuthenticationController(
|
|
|
|
|
UserManager userManager,
|
|
|
|
|
TenantManager tenantManager,
|
2019-09-13 11:18:27 +00:00
|
|
|
|
SecurityContext securityContext,
|
2019-11-08 12:21:51 +00:00
|
|
|
|
TenantCookieSettingsHelper tenantCookieSettingsHelper,
|
2019-09-27 10:45:37 +00:00
|
|
|
|
EmailValidationKeyProvider emailValidationKeyProvider,
|
|
|
|
|
AuthContext authContext,
|
2019-11-12 11:32:05 +00:00
|
|
|
|
AuthManager authManager,
|
|
|
|
|
CookiesManager cookiesManager)
|
2019-09-09 12:56:33 +00:00
|
|
|
|
{
|
|
|
|
|
UserManager = userManager;
|
|
|
|
|
TenantManager = tenantManager;
|
|
|
|
|
SecurityContext = securityContext;
|
2019-11-08 12:21:51 +00:00
|
|
|
|
TenantCookieSettingsHelper = tenantCookieSettingsHelper;
|
2019-09-27 10:45:37 +00:00
|
|
|
|
EmailValidationKeyProvider = emailValidationKeyProvider;
|
|
|
|
|
AuthContext = authContext;
|
|
|
|
|
AuthManager = authManager;
|
2019-11-12 11:32:05 +00:00
|
|
|
|
CookiesManager = cookiesManager;
|
2019-09-09 12:56:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-25 10:46:10 +00:00
|
|
|
|
[Create(false)]
|
2019-05-28 09:40:37 +00:00
|
|
|
|
public AuthenticationTokenData AuthenticateMe([FromBody]AuthModel auth)
|
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
var tenant = TenantManager.GetCurrentTenant();
|
2019-08-08 09:26:58 +00:00
|
|
|
|
var user = GetUser(tenant.TenantId, auth.UserName, auth.Password);
|
2019-05-28 09:40:37 +00:00
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
2019-09-20 15:53:27 +00:00
|
|
|
|
var token = SecurityContext.AuthenticateMe(user.ID);
|
2019-11-12 11:46:58 +00:00
|
|
|
|
CookiesManager.SetCookies(CookiesType.AuthKey, token);
|
2019-11-08 12:21:51 +00:00
|
|
|
|
var expires = TenantCookieSettingsHelper.GetExpiresTime(tenant.TenantId);
|
2019-05-28 09:40:37 +00:00
|
|
|
|
|
|
|
|
|
return new AuthenticationTokenData
|
|
|
|
|
{
|
|
|
|
|
Token = token,
|
|
|
|
|
Expires = expires
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("User authentication failed");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-11-12 11:32:05 +00:00
|
|
|
|
[Create("logout")]
|
|
|
|
|
public void Logout()
|
|
|
|
|
{
|
|
|
|
|
CookiesManager.ClearCookies(CookiesType.AuthKey);
|
|
|
|
|
CookiesManager.ClearCookies(CookiesType.SocketIO);
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-26 13:36:53 +00:00
|
|
|
|
[AllowAnonymous]
|
|
|
|
|
[Create("confirm", false)]
|
|
|
|
|
public ValidationResult CheckConfirm([FromBody]EmailValidationKeyModel model)
|
|
|
|
|
{
|
2019-10-31 11:28:30 +00:00
|
|
|
|
return model.Validate(EmailValidationKeyProvider, AuthContext, TenantManager, UserManager, AuthManager);
|
2019-09-26 13:36:53 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-09-09 12:56:33 +00:00
|
|
|
|
private UserInfo GetUser(int tenantId, string userName, string password)
|
2019-05-28 09:40:37 +00:00
|
|
|
|
{
|
2019-09-09 12:56:33 +00:00
|
|
|
|
var user = UserManager.GetUsers(
|
2019-08-08 09:26:58 +00:00
|
|
|
|
tenantId,
|
2019-05-28 09:40:37 +00:00
|
|
|
|
userName,
|
|
|
|
|
Hasher.Base64Hash(password, HashAlg.SHA256));
|
|
|
|
|
|
2019-09-09 12:56:33 +00:00
|
|
|
|
if (user == null || !UserManager.UserExists(user))
|
2019-05-28 09:40:37 +00:00
|
|
|
|
{
|
|
|
|
|
throw new Exception("user not found");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return user;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class AuthenticationTokenData
|
|
|
|
|
{
|
|
|
|
|
public string Token { get; set; }
|
|
|
|
|
|
|
|
|
|
public DateTime Expires { get; set; }
|
|
|
|
|
|
|
|
|
|
public bool Sms { get; set; }
|
|
|
|
|
|
|
|
|
|
public string PhoneNoise { get; set; }
|
|
|
|
|
|
|
|
|
|
public bool Tfa { get; set; }
|
|
|
|
|
|
|
|
|
|
public string TfaKey { get; set; }
|
|
|
|
|
|
|
|
|
|
public static AuthenticationTokenData GetSample()
|
|
|
|
|
{
|
|
|
|
|
return new AuthenticationTokenData
|
|
|
|
|
{
|
|
|
|
|
Expires = DateTime.UtcNow,
|
|
|
|
|
Token = "abcde12345",
|
|
|
|
|
Sms = false,
|
|
|
|
|
PhoneNoise = null,
|
|
|
|
|
Tfa = false,
|
|
|
|
|
TfaKey = null
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-10-31 13:54:43 +00:00
|
|
|
|
|
|
|
|
|
public static class AuthenticationControllerExtension
|
|
|
|
|
{
|
|
|
|
|
public static IServiceCollection AddAuthenticationController(this IServiceCollection services)
|
|
|
|
|
{
|
|
|
|
|
return services
|
|
|
|
|
.AddUserManagerService()
|
|
|
|
|
.AddTenantManagerService()
|
|
|
|
|
.AddSecurityContextService()
|
|
|
|
|
.AddTenantCookieSettingsService()
|
|
|
|
|
.AddEmailValidationKeyProviderService()
|
|
|
|
|
.AddAuthContextService()
|
|
|
|
|
.AddAuthManager();
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-05-28 09:40:37 +00:00
|
|
|
|
}
|