Получение 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)