C#.net active directory options
I have the following questions to ask about a C#.net 2008 desktop application that i want to modify by accessing the active directory values:
1. I am assuming the following code accesses the active directory and only keeps one active directory group value at a time. if not, can you tell me what is wrong with my assupmption.
a. The following code is the start call:
void InitBrowser()
{
CurrentUser = new TUser();
UserIs_Read = CurrentUser.HasTRole(TUser.TRole.Reader);
}
b. The following is the code it calls;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Principal;
namespace T.Common
{
public class TUser
{
public enum TRole
{
User = 0,
Manager = 1,
Administrator = 2,
Reader =3
}
public WindowsIdentity Identity;
public WindowsPrincipal Principal;
string _Domain;
public string Domain
{
get { return _Domain; }
}
string _Username;
public string Username
{
get { return _Username; }
}
public TUser()
{
this.Identity = WindowsIdentity.GetCurrent();
string[] NameInfo = this.Identity.Name.Split('\\');
_Domain = NameInfo[0];
_Username = NameInfo[1];
}
public bool HasTUser(TRole Role)
{
switch (Role)
{
case TRole.Reader:
return IsInGroup("Reader");
case Reader.Manager:
return IsInGroup("Managers");
//break;
case EnrollTracRole.Administrator:
return IsInGroup("Administrators");
//break;
case EnrollTracRole.User:
return true;
//break;
default:
return false;
}
}
public bool IsInGroup(string GroupName)
{
if (this.Principal == null)
{
this.Principal = new WindowsPrincipal(this.Identity);
}
return this.Principal.IsInRole(GroupName);
}
2. Would I somehow benefit from the code below instead of using the code I listed above? (the code below is just a small part of the active directory logic I would be using) If so, can you tell me how the following code is better:
private String[] ADSearch(String ConnectionString, String filter, String field){
DirectoryEntry SearchRoot =
new DirectoryEntry(ConnectionString, _userName, _pwd);
DirectorySearcher searcher =
new DirectorySearcher (SearchRoot, filter);
{
SearchRoot,
Filter = filter,
PageSize = 100
};
seararcher.PropertiesToLoad.Clear();
searcher.PropertiesToLoad.Add(field);
try
{
using (SearchResultCollection results = searcher.FindAll())
{
List<string> r = new List<string>();
foreach (SearchResult searchResult in results)
{
var prop = searchResult.Properties[field];
for (int index = 0; index < prop.Count; index++)
r.Add(prop[index].ToString());
}
return r.Count > 0 ? r.ToArray() : new string[0];
}
}
catch (Exception ex)
{
throw new ProviderException("Unable to query Active Directory.", ex);
}
}
public bool ValidateUser(string username, string password)
{
bool result = false;
try
{
using (var context =
new PrincipalContext(ContextType.Machine,_domain, null, _userName, _pwd))
{
result = context.ValidateCredentials(username, password);
}
}
catch (Exception ex)
{
/ TODO: log exception
}
return result;
}