Feature #42: Active Directory Interop Upgrade

AD Interop moved to Disco.Services; Supports multi-domain environments,
sites, and searching restricted with OUs.
This commit is contained in:
Gary Sharp
2014-04-10 17:58:04 +10:00
parent b841c6b2c0
commit db73cc1a12
218 changed files with 6383 additions and 2535 deletions
-13
View File
@@ -1,13 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Disco.Services.Users
{
public static class Searching
{
}
}
+42
View File
@@ -0,0 +1,42 @@
using Disco.Models.Repository;
using Disco.Services.Interop.ActiveDirectory;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Disco.Services
{
public static class UserExtensions
{
public static bool IsInPrimaryDomain(this User u)
{
return u.Domain.Equals(Disco.Services.Interop.ActiveDirectory.ActiveDirectory.PrimaryDomain.NetBiosName, StringComparison.InvariantCultureIgnoreCase);
}
public static string FriendlyId(this User u)
{
return FriendlyUserId(u.UserId);
}
public static string FriendlyUserId(string UserId)
{
var splitUserId = SplitUserId(UserId);
if (splitUserId.Item1 != null && splitUserId.Item1.Equals(ActiveDirectory.PrimaryDomain.NetBiosName, StringComparison.InvariantCultureIgnoreCase))
return splitUserId.Item2;
else
return UserId;
}
public static Tuple<string, string> SplitUserId(string UserId)
{
var slashIndex = UserId.IndexOf('\\');
if (slashIndex < 0)
return Tuple.Create<string, string>(null, UserId);
else
return Tuple.Create(UserId.Substring(0, slashIndex), UserId.Substring(slashIndex + 1));
}
}
}
+10 -29
View File
@@ -3,6 +3,7 @@ using Disco.Models.Interop.ActiveDirectory;
using Disco.Models.Repository;
using Disco.Services.Authorization;
using Disco.Services.Authorization.Roles;
using Disco.Services.Interop.ActiveDirectory;
using Disco.Services.Logging;
using Newtonsoft.Json;
using System;
@@ -20,19 +21,9 @@ namespace Disco.Services.Users
public static class UserService
{
private const string _cacheHttpRequestKey = "Disco_CurrentUserToken";
private static Func<string, string[], ActiveDirectoryUserAccount> _GetActiveDirectoryUserAccount;
private static Func<string, string[], ActiveDirectoryMachineAccount> _GetActiveDirectoryMachineAccount;
private static Func<string, List<ActiveDirectoryUserAccount>> _SearchActiveDirectoryUsers;
public static void Initialize(DiscoDataContext Database,
Func<string, string[], ActiveDirectoryUserAccount> GetActiveDirectoryUserAccount,
Func<string, string[], ActiveDirectoryMachineAccount> GetActiveDirectoryMachineAccount,
Func<string, List<ActiveDirectoryUserAccount>> SearchActiveDirectoryUsers)
public static void Initialize(DiscoDataContext Database)
{
_GetActiveDirectoryUserAccount = GetActiveDirectoryUserAccount;
_GetActiveDirectoryMachineAccount = GetActiveDirectoryMachineAccount;
_SearchActiveDirectoryUsers = SearchActiveDirectoryUsers;
Authorization.Roles.RoleCache.Initialize(Database);
}
@@ -56,10 +47,7 @@ namespace Disco.Services.Users
userId = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
}
if (userId.Contains("\\"))
return userId.Substring(checked(userId.IndexOf("\\") + 1));
else
return userId;
return userId;
}
}
@@ -204,38 +192,31 @@ namespace Disco.Services.Users
Cache.FlushCache();
}
internal static List<ActiveDirectoryUserAccount> SearchUsers(string Term)
internal static IEnumerable<ActiveDirectoryUserAccount> SearchUsers(DiscoDataContext Database, string Term)
{
return _SearchActiveDirectoryUsers(Term);
}
internal static List<ActiveDirectoryUserAccount> SearchUsers(DiscoDataContext Database, string Term)
{
var adImportedUsers = SearchUsers(Term);
var adImportedUsers = ActiveDirectory.SearchUserAccounts(Term);
foreach (var adU in adImportedUsers.Select(adU => adU.ToRepositoryUser()))
{
var existingUser = Database.Users.Find(adU.Id);
var existingUser = Database.Users.Find(adU.UserId);
if (existingUser != null)
existingUser.UpdateSelf(adU);
else
Database.Users.Add(adU);
Database.SaveChanges();
UserService.InvalidateCachedUser(adU.Id);
UserService.InvalidateCachedUser(adU.UserId);
}
return adImportedUsers;
}
internal static Tuple<User, AuthorizationToken> ImportUser(DiscoDataContext Database, string UserId)
{
if (_GetActiveDirectoryUserAccount == null)
throw new InvalidOperationException("UserServer has not been Initialized");
if (string.IsNullOrEmpty(UserId))
throw new ArgumentNullException("UserId is required", "UserId");
if (UserId.EndsWith("$"))
{
// Machine Account
var adAccount = _GetActiveDirectoryMachineAccount(UserId, null);
var adAccount = ActiveDirectory.RetrieveMachineAccount(UserId);
if (adAccount == null)
return null;
@@ -252,7 +233,7 @@ namespace Disco.Services.Users
ActiveDirectoryUserAccount adAccount;
try
{
adAccount = _GetActiveDirectoryUserAccount(UserId, null);
adAccount = ActiveDirectory.RetrieveUserAccount(UserId);
if (adAccount == null)
throw new ArgumentException(string.Format("Invalid Username: '{0}'; User not found in Active Directory", UserId), "Username");
@@ -275,7 +256,7 @@ namespace Disco.Services.Users
var user = adAccount.ToRepositoryUser();
// Update Repository
User existingUser = Database.Users.Find(user.Id);
User existingUser = Database.Users.Find(user.UserId);
if (existingUser == null)
Database.Users.Add(user);
else