В настоящее время я стремлюсь реализовать поставщика ролей только для чтения для приложения ASP.NET на основе групп безопасности домена с использованием утилит в сборке System.DirectoryServices.AccountManagement
. У меня есть следующий фрагмент кода, который отлично работает в моем домене разработки, но не работает в среде развертывания:
Using myContext As New PrincipalContext(ContextType.Domain, Nothing, "DC=My,DC=Controller", accountName, accountPassword)
Try
Dim p As UserPrincipal = UserPrincipal.FindByIdentity(myContext, IdentityType.SamAccountName, userName)
Dim groups = p.GetAuthorizationGroups()
For Each g In groups
Debug.WriteLine("Found security group: " & g.DisplayName & vbNewLine)
Next
Catch ex As Exception
Debug.WriteLine("Encountered an exception: " & vbNewLine & ex.ToString())
End Try
End Using
Трассировка стека исключений возвращается следующим образом:
System.DirectoryServices.AccountManagement.PrincipalOperationException: There is no such object on the server. ---> System.DirectoryServices.DirectoryServicesCOMException (0x80072030): There is no such object on the server. at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) at System.DirectoryServices.DirectoryEntry.Bind() at System.DirectoryServices.DirectoryEntry.get_SchemaEntry() at System.DirectoryServices.AccountManagement.ADStoreCtx.IsContainer(DirectoryEntry de) at System.DirectoryServices.AccountManagement.ADStoreCtx..ctor(DirectoryEntry ctxBase, Boolean ownCtxBase, String username, String password, ContextOptions options) at System.DirectoryServices.AccountManagement.PrincipalContext.CreateContextFromDirectoryEntry(DirectoryEntry entry) at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit() --- End of inner exception stack trace --- at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit() 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, IdentityType identityType, String identityValue) at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue)
Я знаю, что очевидная проблема здесь заключается в том, чтобы убедиться, что объект собственно, ну ... существует на сервере.Тем не менее, я могу без сомнения подтвердить, что независимо от того, какое имя учетной записи SAM я использую, я получаю один и тот же результат от звонка. Кроме того, Microsoft ActiveDirectoryMembershipProvider
не имеет проблем с аутентификацией по тому же имени учетной записи SAM, и я могу найти объект, используя эту информацию с помощью класса DirectorySearcher
. Единственное различие, которое я могу определить между сетью разработки и развертыванием, заключается в том, что DC среды развертывания - это Windows Server 2003, тогда как локально я разрабатываю с помощью Windows Server 2008 DC. Что я могу пропустить?