Replace Singletons with DI.
Added support for working with db. Added first version of CookieAuthHandler. Added PeopleController for test auth.
This commit is contained in:
parent
4ac9644a98
commit
60b30ce542
@ -47,8 +47,11 @@
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http.Extensions" Version="2.2.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="3.0.0-preview5-19227-01" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="3.0.0-preview5.19227.9" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="2.2.4" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.UnitTesting" Version="11.0.50727.1" />
|
||||
<PackageReference Include="Microsoft.Windows.Compatibility" Version="2.0.1" />
|
||||
<PackageReference Include="MySql.Data" Version="8.0.16" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
|
||||
<PackageReference Include="NLog" Version="4.6.3" />
|
||||
<PackageReference Include="NVelocity" Version="1.2.0" />
|
||||
|
@ -84,7 +84,8 @@ namespace ASC.Common.Data
|
||||
{
|
||||
get { return Command.Connection; }
|
||||
}
|
||||
|
||||
|
||||
DbRegistry DbRegistry { get => (DbRegistry)HttpContext.Current.RequestServices.GetService(typeof(DbRegistry)); }
|
||||
|
||||
public DbManager(string databaseId, int? commandTimeout = null)
|
||||
: this(databaseId, true, commandTimeout)
|
||||
|
@ -31,10 +31,19 @@ using System.Data;
|
||||
using System.Data.Common;
|
||||
using ASC.Common.Data.Sql;
|
||||
using ASC.Common.Data.Sql.Dialects;
|
||||
|
||||
using Microsoft.Extensions.Configuration;
|
||||
|
||||
namespace ASC.Common.Data
|
||||
{
|
||||
public static class DbRegistry
|
||||
{
|
||||
public class DbProviderFactoryCustom
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Invariant { get; set; }
|
||||
public string Description { get; set; }
|
||||
public string Type { get; set; }
|
||||
}
|
||||
|
||||
public class DbRegistry
|
||||
{
|
||||
private const string DEFAULT = "DEFAULT";
|
||||
private static readonly object syncRoot = new object();
|
||||
@ -42,14 +51,17 @@ namespace ASC.Common.Data
|
||||
private static readonly IDictionary<string, string> connnectionStrings = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
|
||||
private static readonly IDictionary<string, ISqlDialect> dialects = new Dictionary<string, ISqlDialect>(StringComparer.InvariantCultureIgnoreCase);
|
||||
private static volatile bool configured = false;
|
||||
|
||||
protected IConfiguration Configuration { get; set; }
|
||||
|
||||
static DbRegistry()
|
||||
{
|
||||
public DbRegistry(IConfiguration configuration)
|
||||
{
|
||||
Configuration = configuration;
|
||||
dialects["MySql.Data.MySqlClient.MySqlClientFactory"] = new MySQLDialect();
|
||||
dialects["System.Data.SQLite.SQLiteFactory"] = new SQLiteDialect();
|
||||
}
|
||||
|
||||
internal static void RegisterDatabase(string databaseId, DbProviderFactory providerFactory, string connectionString)
|
||||
internal void RegisterDatabase(string databaseId, DbProviderFactory providerFactory, string connectionString)
|
||||
{
|
||||
if (string.IsNullOrEmpty(databaseId)) throw new ArgumentNullException("databaseId");
|
||||
if (providerFactory == null) throw new ArgumentNullException("providerFactory");
|
||||
@ -70,17 +82,17 @@ namespace ASC.Common.Data
|
||||
}
|
||||
}
|
||||
|
||||
internal static void RegisterDatabase(string databaseId, string providerInvariantName, string connectionString)
|
||||
internal void RegisterDatabase(string databaseId, string providerInvariantName, string connectionString)
|
||||
{
|
||||
RegisterDatabase(databaseId, DbProviderFactories.GetFactory(providerInvariantName), connectionString);
|
||||
}
|
||||
|
||||
public static void RegisterDatabase(string databaseId, ConnectionStringSettings connectionString)
|
||||
public void RegisterDatabase(string databaseId, ConnectionStringSettings connectionString)
|
||||
{
|
||||
RegisterDatabase(databaseId, connectionString.ProviderName, connectionString.ConnectionString);
|
||||
}
|
||||
|
||||
public static void UnRegisterDatabase(string databaseId)
|
||||
public void UnRegisterDatabase(string databaseId)
|
||||
{
|
||||
if (string.IsNullOrEmpty(databaseId)) throw new ArgumentNullException("databaseId");
|
||||
|
||||
@ -107,7 +119,7 @@ namespace ASC.Common.Data
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsDatabaseRegistered(string databaseId)
|
||||
public bool IsDatabaseRegistered(string databaseId)
|
||||
{
|
||||
lock (syncRoot)
|
||||
{
|
||||
@ -115,7 +127,7 @@ namespace ASC.Common.Data
|
||||
}
|
||||
}
|
||||
|
||||
public static DbConnection CreateDbConnection(string databaseId)
|
||||
public DbConnection CreateDbConnection(string databaseId)
|
||||
{
|
||||
Configure();
|
||||
|
||||
@ -132,7 +144,7 @@ namespace ASC.Common.Data
|
||||
return connection;
|
||||
}
|
||||
|
||||
public static DbProviderFactory GetDbProviderFactory(string databaseId)
|
||||
public DbProviderFactory GetDbProviderFactory(string databaseId)
|
||||
{
|
||||
Configure();
|
||||
|
||||
@ -143,7 +155,7 @@ namespace ASC.Common.Data
|
||||
return providers.ContainsKey(databaseId) ? providers[databaseId] : null;
|
||||
}
|
||||
|
||||
public static ConnectionStringSettings GetConnectionString(string databaseId)
|
||||
public ConnectionStringSettings GetConnectionString(string databaseId)
|
||||
{
|
||||
Configure();
|
||||
|
||||
@ -154,7 +166,7 @@ namespace ASC.Common.Data
|
||||
return connnectionStrings.ContainsKey(databaseId) ? new ConnectionStringSettings(databaseId, connnectionStrings[databaseId], providers[databaseId].GetType().Name) : null;
|
||||
}
|
||||
|
||||
public static ISqlDialect GetSqlDialect(string databaseId)
|
||||
public ISqlDialect GetSqlDialect(string databaseId)
|
||||
{
|
||||
var provider = GetDbProviderFactory(databaseId);
|
||||
if (provider != null && dialects.ContainsKey(provider.GetType().FullName))
|
||||
@ -165,18 +177,30 @@ namespace ASC.Common.Data
|
||||
}
|
||||
|
||||
|
||||
public static void Configure()
|
||||
public void Configure()
|
||||
{
|
||||
if (!configured)
|
||||
{
|
||||
lock (syncRoot)
|
||||
{
|
||||
if (!configured)
|
||||
{
|
||||
{
|
||||
var dbProviderFactories = Configuration.GetSection("DbProviderFactories");
|
||||
|
||||
foreach (var ch in dbProviderFactories.GetChildren())
|
||||
{
|
||||
var cs = new DbProviderFactoryCustom();
|
||||
ch.Bind(cs);
|
||||
DbProviderFactories.RegisterFactory(cs.Invariant, cs.Type);
|
||||
}
|
||||
|
||||
var connectionStrings = Configuration.GetSection("ConnectionStrings");
|
||||
var factories = DbProviderFactories.GetFactoryClasses();
|
||||
AppDomain.CurrentDomain.SetData("DataDirectory", AppDomain.CurrentDomain.BaseDirectory); //SQLite
|
||||
foreach (ConnectionStringSettings cs in ConfigurationManager.ConnectionStrings)
|
||||
{
|
||||
foreach (var ch in connectionStrings.GetChildren())
|
||||
{
|
||||
var cs = new ConnectionStringSettings();
|
||||
ch.Bind(cs);
|
||||
var factory = factories.Rows.Find(cs.ProviderName);
|
||||
if (factory == null)
|
||||
{
|
||||
|
@ -35,16 +35,20 @@ using System.Text;
|
||||
|
||||
namespace ASC.Security.Cryptography
|
||||
{
|
||||
public static class InstanceCrypto
|
||||
{
|
||||
public static string Encrypt(string data)
|
||||
public class InstanceCrypto
|
||||
{
|
||||
protected MachinePseudoKeys MachinePseudoKeys { get; set; }
|
||||
|
||||
public InstanceCrypto(MachinePseudoKeys machinePseudoKeys) => MachinePseudoKeys = machinePseudoKeys;
|
||||
|
||||
public string Encrypt(string data)
|
||||
{
|
||||
return Convert.ToBase64String(Encrypt(Encoding.UTF8.GetBytes(data)));
|
||||
}
|
||||
|
||||
public static byte[] Encrypt(byte[] data)
|
||||
public byte[] Encrypt(byte[] data)
|
||||
{
|
||||
Rijndael hasher = Rijndael.Create();
|
||||
var hasher = Rijndael.Create();
|
||||
hasher.Key = EKey();
|
||||
hasher.IV = new byte[hasher.BlockSize >> 3];
|
||||
using (var ms = new MemoryStream())
|
||||
@ -57,14 +61,14 @@ namespace ASC.Security.Cryptography
|
||||
}
|
||||
}
|
||||
|
||||
public static string Decrypt(string data)
|
||||
public string Decrypt(string data)
|
||||
{
|
||||
return Encoding.UTF8.GetString(Decrypt(Convert.FromBase64String(data)));
|
||||
}
|
||||
|
||||
public static byte[] Decrypt(byte[] data)
|
||||
public byte[] Decrypt(byte[] data)
|
||||
{
|
||||
Rijndael hasher = Rijndael.Create();
|
||||
var hasher = Rijndael.Create();
|
||||
hasher.Key = EKey();
|
||||
hasher.IV = new byte[hasher.BlockSize >> 3];
|
||||
|
||||
@ -80,7 +84,7 @@ namespace ASC.Security.Cryptography
|
||||
}
|
||||
}
|
||||
|
||||
private static byte[] EKey()
|
||||
private byte[] EKey()
|
||||
{
|
||||
return MachinePseudoKeys.GetMachineConstant(32);
|
||||
}
|
||||
|
@ -30,20 +30,21 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using ASC.Common.Security;
|
||||
|
||||
using Microsoft.Extensions.Configuration;
|
||||
|
||||
namespace ASC.Security.Cryptography
|
||||
{
|
||||
public static class MachinePseudoKeys
|
||||
public class MachinePseudoKeys
|
||||
{
|
||||
private static readonly byte[] confkey = null;
|
||||
private byte[] confkey = null;
|
||||
|
||||
|
||||
static MachinePseudoKeys()
|
||||
public MachinePseudoKeys(IConfiguration configuration)
|
||||
{
|
||||
var key = ConfigurationManager.AppSettings["core.machinekey"];
|
||||
var key = configuration["core:machinekey"];
|
||||
if (string.IsNullOrEmpty(key))
|
||||
{
|
||||
key = ConfigurationManager.AppSettings["asc.common.machinekey"];
|
||||
key = configuration["asc:common.machinekey"];
|
||||
}
|
||||
if (!string.IsNullOrEmpty(key))
|
||||
{
|
||||
@ -52,7 +53,7 @@ namespace ASC.Security.Cryptography
|
||||
}
|
||||
|
||||
|
||||
public static byte[] GetMachineConstant()
|
||||
public byte[] GetMachineConstant()
|
||||
{
|
||||
if (confkey != null)
|
||||
{
|
||||
@ -64,7 +65,7 @@ namespace ASC.Security.Cryptography
|
||||
return BitConverter.GetBytes(fi.CreationTime.ToOADate());
|
||||
}
|
||||
|
||||
public static byte[] GetMachineConstant(int bytesCount)
|
||||
public byte[] GetMachineConstant(int bytesCount)
|
||||
{
|
||||
var cnst = Enumerable.Repeat<byte>(0, sizeof (int)).Concat(GetMachineConstant()).ToArray();
|
||||
var icnst = BitConverter.ToInt32(cnst, cnst.Length - sizeof (int));
|
||||
|
@ -35,14 +35,16 @@ using Microsoft.AspNetCore.WebUtilities;
|
||||
|
||||
namespace ASC.Common.Utils
|
||||
{
|
||||
public static class Signature
|
||||
{
|
||||
public static string Create<T>(T obj)
|
||||
public class Signature
|
||||
{
|
||||
protected MachinePseudoKeys MachinePseudoKeys { get; set; }
|
||||
public Signature(MachinePseudoKeys machinePseudoKeys) => MachinePseudoKeys = machinePseudoKeys;
|
||||
public string Create<T>(T obj)
|
||||
{
|
||||
return Create(obj, Encoding.UTF8.GetString(MachinePseudoKeys.GetMachineConstant()));
|
||||
}
|
||||
|
||||
public static string Create<T>(T obj, string secret)
|
||||
public string Create<T>(T obj, string secret)
|
||||
{
|
||||
var serializer = new JavaScriptSerializer();
|
||||
var str = serializer.Serialize(obj);
|
||||
@ -50,17 +52,17 @@ namespace ASC.Common.Utils
|
||||
return WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(payload));
|
||||
}
|
||||
|
||||
public static T Read<T>(string signature)
|
||||
public T Read<T>(string signature)
|
||||
{
|
||||
return Read<T>(signature, Encoding.UTF8.GetString(MachinePseudoKeys.GetMachineConstant()));
|
||||
}
|
||||
|
||||
public static T Read<T>(string signature, string secret)
|
||||
public T Read<T>(string signature, string secret)
|
||||
{
|
||||
return Read<T>(signature, secret, true);
|
||||
}
|
||||
|
||||
public static T Read<T>(string signature, string secret, bool useSecret)
|
||||
public T Read<T>(string signature, string secret, bool useSecret)
|
||||
{
|
||||
try
|
||||
{
|
||||
@ -76,15 +78,15 @@ namespace ASC.Common.Utils
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
return default(T);
|
||||
return default;
|
||||
}
|
||||
|
||||
private static string GetHashBase64(string str)
|
||||
private string GetHashBase64(string str)
|
||||
{
|
||||
return Convert.ToBase64String(SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(str)));
|
||||
}
|
||||
|
||||
private static string GetHashBase64MD5(string str)
|
||||
private string GetHashBase64MD5(string str)
|
||||
{
|
||||
return Convert.ToBase64String(MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(str)));
|
||||
}
|
||||
|
@ -33,6 +33,5 @@
|
||||
<PackageReference Include="AWSSDK.S3" Version="3.3.101.16" />
|
||||
<PackageReference Include="AWSSDK.SimpleEmail" Version="3.3.100.18" />
|
||||
<PackageReference Include="MailKit" Version="2.1.5.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0" />
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -31,16 +31,16 @@ using System.Globalization;
|
||||
|
||||
namespace ASC.Core.Configuration
|
||||
{
|
||||
class ConnectionStringNameTypeConverter : TypeConverter
|
||||
{
|
||||
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
|
||||
{
|
||||
return sourceType == typeof(string);
|
||||
}
|
||||
//class ConnectionStringNameTypeConverter : TypeConverter
|
||||
//{
|
||||
// public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
|
||||
// {
|
||||
// return sourceType == typeof(string);
|
||||
// }
|
||||
|
||||
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
|
||||
{
|
||||
return DbRegistry.GetConnectionString((string)value);
|
||||
}
|
||||
}
|
||||
// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
|
||||
// {
|
||||
// return DbRegistry.GetConnectionString((string)value);
|
||||
// }
|
||||
//}
|
||||
}
|
||||
|
@ -34,16 +34,19 @@ using ASC.Core.Data;
|
||||
|
||||
namespace ASC.Core
|
||||
{
|
||||
public static class CoreContext
|
||||
{
|
||||
static CoreContext()
|
||||
{
|
||||
public class CoreContext
|
||||
{
|
||||
public DbRegistry DbRegistry { get; set; }
|
||||
public CoreContext(DbRegistry dbRegistry)
|
||||
{
|
||||
DbRegistry = dbRegistry;
|
||||
ConfigureCoreContextByDefault();
|
||||
}
|
||||
|
||||
|
||||
public static CoreConfiguration Configuration { get; private set; }
|
||||
|
||||
public TenantManager TenantManager1 => TenantManager;
|
||||
public static TenantManager TenantManager { get; private set; }
|
||||
|
||||
public static UserManager UserManager { get; private set; }
|
||||
@ -69,7 +72,7 @@ namespace ASC.Core
|
||||
}
|
||||
}
|
||||
|
||||
private static void ConfigureCoreContextByDefault()
|
||||
private void ConfigureCoreContextByDefault()
|
||||
{
|
||||
var cs = DbRegistry.GetConnectionString("core");
|
||||
if (cs == null)
|
||||
|
@ -36,18 +36,17 @@ using ASC.Common.Logging;
|
||||
using ASC.Common.Security;
|
||||
using ASC.Common.Security.Authentication;
|
||||
using ASC.Common.Security.Authorizing;
|
||||
using ASC.Common.Web;
|
||||
using ASC.Core.Billing;
|
||||
using ASC.Core.Security.Authentication;
|
||||
using ASC.Core.Security.Authorizing;
|
||||
using ASC.Core.Tenants;
|
||||
using ASC.Core.Users;
|
||||
using ASC.Security.Cryptography;
|
||||
using Microsoft.AspNetCore.Http.Features;
|
||||
|
||||
using Microsoft.Extensions.Configuration;
|
||||
|
||||
namespace ASC.Core
|
||||
{
|
||||
public static class SecurityContext
|
||||
public class SecurityContext
|
||||
{
|
||||
private static readonly ILog log = LogManager.GetLogger("ASC.Core");
|
||||
|
||||
@ -64,15 +63,21 @@ namespace ASC.Core
|
||||
|
||||
public static IPermissionResolver PermissionResolver { get; private set; }
|
||||
|
||||
protected IConfiguration configuration { get; set; }
|
||||
protected CookieStorage cookieStorage { get; set; }
|
||||
protected CoreContext CoreContext { get; set; }
|
||||
|
||||
public SecurityContext(IConfiguration configuration, CookieStorage cookieStorage, CoreContext coreContext)
|
||||
{
|
||||
this.configuration = configuration;
|
||||
this.cookieStorage = cookieStorage;
|
||||
CoreContext = coreContext;
|
||||
|
||||
static SecurityContext()
|
||||
{
|
||||
var azManager = new AzManager(new RoleProvider(), new PermissionProvider());
|
||||
PermissionResolver = new PermissionResolver(azManager);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static string AuthenticateMe(string login, string password)
|
||||
public string AuthenticateMe(string login, string password)
|
||||
{
|
||||
if (login == null) throw new ArgumentNullException("login");
|
||||
if (password == null) throw new ArgumentNullException("password");
|
||||
@ -83,7 +88,7 @@ namespace ASC.Core
|
||||
return AuthenticateMe(new UserAccount(u, tenantid));
|
||||
}
|
||||
|
||||
public static bool AuthenticateMe(string cookie)
|
||||
public bool AuthenticateMe(string cookie)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(cookie))
|
||||
{
|
||||
@ -107,9 +112,9 @@ namespace ASC.Core
|
||||
}
|
||||
log.InfoFormat("Empty Bearer cookie: {0} {1}", ipFrom, address);
|
||||
}
|
||||
else if (CookieStorage.DecryptCookie(cookie, out tenant, out userid, out login, out password, out indexTenant, out expire, out indexUser))
|
||||
else if (cookieStorage.DecryptCookie(cookie, out tenant, out userid, out login, out password, out indexTenant, out expire, out indexUser))
|
||||
{
|
||||
if (tenant != CoreContext.TenantManager.GetCurrentTenant().TenantId)
|
||||
if (tenant != CoreContext.TenantManager1.GetCurrentTenant().TenantId)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -175,7 +180,7 @@ namespace ASC.Core
|
||||
return false;
|
||||
}
|
||||
|
||||
public static string AuthenticateMe(IAccount account)
|
||||
public string AuthenticateMe(IAccount account)
|
||||
{
|
||||
if (account == null || account.Equals(Configuration.Constants.Guest)) throw new InvalidCredentialException("account");
|
||||
|
||||
@ -215,7 +220,7 @@ namespace ASC.Core
|
||||
roles.Add(Role.Users);
|
||||
|
||||
account = new UserAccount(u, CoreContext.TenantManager.GetCurrentTenant().TenantId);
|
||||
cookie = CookieStorage.EncryptCookie(CoreContext.TenantManager.GetCurrentTenant().TenantId, account.ID);
|
||||
cookie = cookieStorage.EncryptCookie(CoreContext.TenantManager.GetCurrentTenant().TenantId, account.ID);
|
||||
}
|
||||
|
||||
Principal = new GenericPrincipal(account, roles.ToArray());
|
||||
@ -223,7 +228,7 @@ namespace ASC.Core
|
||||
return cookie;
|
||||
}
|
||||
|
||||
public static string AuthenticateMe(Guid userId)
|
||||
public string AuthenticateMe(Guid userId)
|
||||
{
|
||||
return AuthenticateMe(CoreContext.Authentication.GetAccountByID(userId));
|
||||
}
|
||||
|
@ -58,7 +58,8 @@ namespace ASC.Core
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
|
||||
|
||||
public CookieStorage CookieStorage { get; set; }
|
||||
|
||||
public HostedSolution(ConnectionStringSettings connectionString)
|
||||
: this(connectionString, null)
|
||||
|
@ -43,7 +43,8 @@ namespace ASC.Core
|
||||
private readonly Dictionary<string, HostedSolution> regions = new Dictionary<string, HostedSolution>();
|
||||
private readonly String dbid;
|
||||
private volatile bool initialized = false;
|
||||
|
||||
|
||||
DbRegistry DbRegistry { get; set; }
|
||||
|
||||
public MultiRegionHostedSolution(string dbid)
|
||||
{
|
||||
|
@ -35,11 +35,14 @@ using ASC.Common.Web;
|
||||
|
||||
namespace ASC.Core.Security.Authentication
|
||||
{
|
||||
class CookieStorage
|
||||
public class CookieStorage
|
||||
{
|
||||
private const string DateTimeFormat = "yyyy-MM-dd HH:mm:ss,fff";
|
||||
protected InstanceCrypto InstanceCrypto { get; set; }
|
||||
|
||||
public CookieStorage(InstanceCrypto instanceCrypto) => InstanceCrypto = instanceCrypto;
|
||||
|
||||
public static bool DecryptCookie(string cookie, out int tenant, out Guid userid, out string login, out string password, out int indexTenant, out DateTime expire, out int indexUser)
|
||||
public bool DecryptCookie(string cookie, out int tenant, out Guid userid, out string login, out string password, out int indexTenant, out DateTime expire, out int indexUser)
|
||||
{
|
||||
tenant = Tenant.DEFAULT_TENANT;
|
||||
userid = Guid.Empty;
|
||||
@ -78,7 +81,7 @@ namespace ASC.Core.Security.Authentication
|
||||
}
|
||||
|
||||
|
||||
public static string EncryptCookie(int tenant, Guid userid, string login = null, string password = null)
|
||||
public string EncryptCookie(int tenant, Guid userid, string login = null, string password = null)
|
||||
{
|
||||
var settingsTenant = TenantCookieSettings.GetForTenant(tenant);
|
||||
var expires = TenantCookieSettings.GetExpiresTime(tenant);
|
||||
@ -86,7 +89,7 @@ namespace ASC.Core.Security.Authentication
|
||||
return EncryptCookie(tenant, userid, login, password, settingsTenant.Index, expires, settingsUser.Index);
|
||||
}
|
||||
|
||||
public static string EncryptCookie(int tenant, Guid userid, string login, string password, int indexTenant, DateTime expires, int indexUser)
|
||||
public string EncryptCookie(int tenant, Guid userid, string login, string password, int indexTenant, DateTime expires, int indexUser)
|
||||
{
|
||||
var s = string.Format("{0}${1}${2}${3}${4}${5}${6}${7}",
|
||||
(login ?? string.Empty).ToLowerInvariant(),
|
||||
@ -102,7 +105,7 @@ namespace ASC.Core.Security.Authentication
|
||||
}
|
||||
|
||||
|
||||
private static string GetUserDepenencySalt()
|
||||
private string GetUserDepenencySalt()
|
||||
{
|
||||
var data = string.Empty;
|
||||
try
|
||||
|
@ -35,7 +35,7 @@ namespace ASC.Core.Common.Tests
|
||||
public class CookieStorageTest
|
||||
{
|
||||
[TestMethod]
|
||||
public void Validate()
|
||||
public void Validate(CookieStorage CookieStorage)
|
||||
{
|
||||
var t1 = 1;
|
||||
var id1 = Guid.NewGuid();
|
||||
|
@ -35,7 +35,7 @@ namespace ASC.Core.Common.Tests
|
||||
public class SignatureTest
|
||||
{
|
||||
[TestMethod]
|
||||
public void TestSignature()
|
||||
public void TestSignature(Signature Signature)
|
||||
{
|
||||
var validObject = new { expire = DateTime.UtcNow.AddMinutes(15), key = "345jhndfg", ip = "192.168.1.1" };
|
||||
var encoded = Signature.Create(validObject, "ThE SeCret Key!");
|
||||
|
@ -1,4 +1,4 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||
@ -15,4 +15,9 @@
|
||||
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.2.3" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\common\ASC.Common\ASC.Common.csproj" />
|
||||
<ProjectReference Include="..\..\common\ASC.Core.Common\ASC.Core.Common.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
20
web/ASC.Web.Api/Controllers/PeopleController.cs
Normal file
20
web/ASC.Web.Api/Controllers/PeopleController.cs
Normal file
@ -0,0 +1,20 @@
|
||||
using System.Collections.Generic;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
|
||||
namespace ASC.Employee.Core.Controllers
|
||||
{
|
||||
[FormatFilter]
|
||||
[Route("api/2.0/[controller]")]
|
||||
[ApiController]
|
||||
[Authorize]
|
||||
public class PeopleController : ControllerBase
|
||||
{
|
||||
// GET api/values
|
||||
[HttpGet("{action}.{format?}")]
|
||||
public ActionResult<IEnumerable<string>> Self()
|
||||
{
|
||||
return new string[] { "value1", "value2" };
|
||||
}
|
||||
}
|
||||
}
|
43
web/ASC.Web.Api/Handlers/CookieAuthHandler.cs
Normal file
43
web/ASC.Web.Api/Handlers/CookieAuthHandler.cs
Normal file
@ -0,0 +1,43 @@
|
||||
using System.Security.Claims;
|
||||
using System.Text.Encodings.Web;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using ASC.Core;
|
||||
using Microsoft.AspNetCore.Authentication;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
namespace ASC.Web.Api.Handlers
|
||||
{
|
||||
public class CookieAuthHandler : AuthenticationHandler<AuthenticationSchemeOptions>
|
||||
{
|
||||
protected SecurityContext SecurityContext { get; set; }
|
||||
|
||||
protected IHttpContextAccessor HttpContextAccessor { get; set; }
|
||||
|
||||
public CookieAuthHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
|
||||
{
|
||||
}
|
||||
|
||||
public CookieAuthHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock, SecurityContext securityContext, IHttpContextAccessor httpContextAccessor)
|
||||
: this(options, logger, encoder, clock)
|
||||
{
|
||||
SecurityContext = securityContext;
|
||||
HttpContextAccessor = httpContextAccessor;
|
||||
}
|
||||
|
||||
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
|
||||
{
|
||||
ASC.Common.HttpContext.Configure(HttpContextAccessor);
|
||||
SecurityContext.AuthenticateMe(Context.Request.Cookies["asc_auth_key"]);
|
||||
|
||||
return Task.FromResult(
|
||||
AuthenticateResult.Success(
|
||||
new AuthenticationTicket(
|
||||
new ClaimsPrincipal(Thread.CurrentPrincipal),
|
||||
new AuthenticationProperties(),
|
||||
Scheme.Name)));
|
||||
}
|
||||
}
|
||||
}
|
@ -1,53 +1,67 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace ASC.Web.Api
|
||||
{
|
||||
public class Startup
|
||||
{
|
||||
public Startup(IConfiguration configuration)
|
||||
{
|
||||
Configuration = configuration;
|
||||
}
|
||||
|
||||
public IConfiguration Configuration { get; }
|
||||
|
||||
// This method gets called by the runtime. Use this method to add services to the container.
|
||||
public void ConfigureServices(IServiceCollection services)
|
||||
{
|
||||
services.AddCors();
|
||||
|
||||
services.AddControllers()
|
||||
.AddNewtonsoftJson();
|
||||
}
|
||||
|
||||
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
||||
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
||||
{
|
||||
if (env.IsDevelopment())
|
||||
{
|
||||
app.UseDeveloperExceptionPage();
|
||||
}
|
||||
|
||||
app.UseCors(builder => builder.AllowAnyOrigin());
|
||||
|
||||
app.UseRouting();
|
||||
|
||||
app.UseAuthorization();
|
||||
|
||||
app.UseEndpoints(endpoints =>
|
||||
{
|
||||
endpoints.MapControllers();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
using ASC.Common.Data;
|
||||
using ASC.Common.Utils;
|
||||
using ASC.Core;
|
||||
using ASC.Core.Security.Authentication;
|
||||
using ASC.Security.Cryptography;
|
||||
using ASC.Web.Api.Handlers;
|
||||
using Microsoft.AspNetCore.Authentication;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
|
||||
namespace ASC.Web.Api
|
||||
{
|
||||
public class Startup
|
||||
{
|
||||
public Startup(IConfiguration configuration)
|
||||
{
|
||||
Configuration = configuration;
|
||||
}
|
||||
|
||||
public IConfiguration Configuration { get; }
|
||||
|
||||
// This method gets called by the runtime. Use this method to add services to the container.
|
||||
public void ConfigureServices(IServiceCollection services)
|
||||
{
|
||||
services.AddSingleton<MachinePseudoKeys>();
|
||||
services.AddSingleton<Signature>();
|
||||
services.AddSingleton<InstanceCrypto>();
|
||||
services.AddSingleton<CookieStorage>();
|
||||
services.AddSingleton<SecurityContext>();
|
||||
services.AddSingleton<DbRegistry>();
|
||||
services.AddSingleton<CoreContext>();
|
||||
|
||||
services.AddControllers()
|
||||
.AddNewtonsoftJson()
|
||||
.AddXmlSerializerFormatters();
|
||||
|
||||
services.AddHttpContextAccessor();
|
||||
|
||||
services.AddAuthentication("cookie")
|
||||
.AddScheme<AuthenticationSchemeOptions, CookieAuthHandler>("cookie", a=> { });
|
||||
}
|
||||
|
||||
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
||||
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
||||
{
|
||||
if (env.IsDevelopment())
|
||||
{
|
||||
app.UseDeveloperExceptionPage();
|
||||
}
|
||||
|
||||
app.UseCors(builder => builder.AllowAnyOrigin());
|
||||
|
||||
app.UseRouting();
|
||||
|
||||
app.UseAuthentication();
|
||||
app.UseAuthorization();
|
||||
|
||||
app.UseEndpoints(endpoints =>
|
||||
{
|
||||
endpoints.MapControllers();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6,5 +6,23 @@
|
||||
"Microsoft.Hosting.Lifetime": "Information"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
"AllowedHosts": "*",
|
||||
"core": {
|
||||
"machinekey": "1123askdasjklasbnd"
|
||||
},
|
||||
"ConnectionStrings": {
|
||||
"default": {
|
||||
"name": "default",
|
||||
"connectionString": "Server=localhost;Database=onlyoffice;User ID=dev;Password=dev;Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none",
|
||||
"providerName": "MySql.Data.MySqlClient"
|
||||
}
|
||||
},
|
||||
"DbProviderFactories": {
|
||||
"mysql": {
|
||||
"name": "MySQL Data Provider",
|
||||
"invariant": "MySql.Data.MySqlClient",
|
||||
"description": ".Net Framework Data Provider for MySQL",
|
||||
"type": "MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user