Member 14368916 Ответов: 1

Получение windowsidentity от SID или имени пользователя


Мы должны проверить, является ли сущность пользователем домена или группой пользователей домена в службе WCF, работающей под определенной учетной записью. Для этого мы используем следующий код:

важное примечание: вызов службы олицетворяется так, чтобы идентификация клиента была восстановлена
// set up domain context
PrincipalContext ctx = newPrincipalContext(ContextType.Domain,domain);
 
// find is entity is a user
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, entityname);

// find if the entity is a usergroupn
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, entityname);

Этот код работает нормально, если служба и клиент работают на одной машине.

Однако если клиент пытается подключить службу с удаленной машины в Findbyidentity мы получаем следующее исключение

SystemException -> While resolving : 
000004DC: LdapErr: DSID-0C0907C2, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v2580

стек вызовов :
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.PropertyValueCollection.PopulateList()
   at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
   at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer()
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()
   at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
   at System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()
   at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate)
   at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, String identityValue)

Теперь мы хотим знать, как это происходит? и сделав еще один шаг, мы можем получить WindowsIdentity пользователя/сущности из его имени/SID, как если бы мы получили это, указанная техника разрешения может быть непосредственно взята из WindowsIdentity.

Что я уже пробовал:

In order to do that we are using the following code:

important note: the service call is impersonated so that client identity is retrived

// set up domain context

PrincipalContext ctx = newPrincipalContext(ContextType.Domain,domain);
 
// find is entity is a user

UserPrincipal user = UserPrincipal.FindByIdentity(ctx, entityname);

// find if the entity is a usergroupn

GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, entityname);

This code is working fine if the service and client is running in the same machine.

However if a client tries to connect the service from a remote machine in Findbyidentity we are getting the following exception

SystemException -> While resolving : 
000004DC: LdapErr: DSID-0C0907C2, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v2580 

call stack :

   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.PropertyValueCollection.PopulateList()
   at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
   at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer()
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()
   at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
   at System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()
   at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate)
   at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, String identityValue)

1 Ответов

Рейтинг:
2

RickZeeland

Вам, вероятно, нужно пройти аутентификацию, смотрите ответы здесь: Решено: требуется ли LDAP учетная запись для входа в систему?[^]