У меня есть приложение MVC5, в котором пользователь должен войти в систему, используя учетные данные домена. Когда я жестко кодирую значения переменных домена, приложение входит в систему без проблем. По соображениям безопасности я установил значения переменных в таблице базы данных, но когда я пытаюсь получить с помощью Linq, я получаю сообщение об ошибке Имена серверов не могут содержать пробел в этой строке:
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domainControllerService.GetDomain());
с трассировкой стека:
at System.DirectoryServices.Protocols.LdapDirectoryIdentifier..ctor(String[] servers, Boolean
fullyQualifiedDnsHostName, Boolean connectionless)
at System.DirectoryServices.Protocols.LdapDirectoryIdentifier..ctor(String server)
at System.DirectoryServices.Protocols.LdapConnection..ctor(String server)
at System.DirectoryServices.AccountManagement.PrincipalContext.ReadServerConfig(String
serverName, ServerProperties& properties) at
System.DirectoryServices.AccountManagement.PrincipalContext.DoServerVerifyAndPropRetrieval()
at System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType,
String name, String container, ContextOptions options, String userName, String password)
at System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType,
String name)
at FBChecklist.Controllers.UserController.Login(DomainControllerViewModel model) in
C:\Users\tshumae.FBC\source\repos\FBCHECKLIST\FBChecklist\Controllers\UserController.cs:line 49
Это код входа в систему с использованием жестко заданных значений (работает):
public ActionResult Login()
{
var model = new DomainControllerViewModel();
// LoginViewModel model = new LoginViewModel();
return View(model);
}
// POST: User/Delete/5
[HttpPost]
public ActionResult Login(DomainControllerViewModel model)
{
try
{
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "MYDOMAIN.CORP");
// find a user
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, model.Username);
if (user != null)
{
// check user lockout state
if (user.IsAccountLockedOut())
{
ViewBag.Message = "Your account is locked out";
}
else
{
bool authentic = false;
try
{
DirectoryEntry entry = new DirectoryEntry("LDAP://XX.XX.XX.XX:XXX/OU=YYY,DC=YYY,DC=corp",, model.Username, model.Password);
DirectoryEntry ldapConnection = new DirectoryEntry("MYDOMAIN.CORP");
ldapConnection.Path = "LDAP://";
ldapConnection.Username ="myusername";
ldapConnection.Password = "mypassword";
ldapConnection.AuthenticationType = AuthenticationTypes.Secure;
....
....
return View();
}
И для извлечения из базы данных я использую (не работает):
[HttpPost]
public ActionResult Login(DomainControllerViewModel model)
{
try
{
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domainControllerService.GetDomain());
...
...
try
{
DirectoryEntry entry = new DirectoryEntry(domainControllerService.GetDirectoryEntry(), model.Username, model.Password);
DirectoryEntry ldapConnection = new DirectoryEntry(domainControllerService.GetDomain());
ldapConnection.Path = "LDAP://";
ldapConnection.Username =domainControllerService.GetUsername();
ldapConnection.Password = domainControllerService.GetPassword();
ldapConnection.AuthenticationType = AuthenticationTypes.Secure;
...
...
return View();
}
Репозиторий (DomainControllerService.cs):
public string GetDomain()
{
var domain = (from j in appEntities.DomainControllers
select new
{
j.Domain
});
return domain.ToString();
}
Я попытался удалить пробелы, используя вариант ниже, но все равно получаю то же исключение:
public string GetDomain()
{
var domain = (from j in appEntities.DomainControllers
select new
{
j.Domain
});
string domaintostring = domain.ToString();
string dom = Helpers.RemoveWhitespace(domaintostring);
return dom;
}
из метода расширения:
public static string RemoveWhitespace(string input)
{
return new string(input.ToCharArray()
.Where(c => !Char.IsWhiteSpace(c))
.ToArray());
}