2015-12-22 2 views
0

У меня есть форма аутентификации:Form Authentication - ошибка операции произошла FindByIdentity

<authentication mode="Forms"> 
</authentication> 
<authorization> 
    <deny users="?" /> 
</authorization> 

У меня есть страница с моим логином и проверить удостоверение, что я делаю:

public static bool ValidateCredentials(string sUserName, string sPassword, string sDomain) 
{ 
    PrincipalContext oPrincipalContext = GetPrincipalContext(sDomain); 
    try 
    { 
     return oPrincipalContext.ValidateCredentials(sUserName, sPassword); 
    } 
    catch (Exception ex) 
    { 
     ASTools.LogError(ex.ToString()); 
     return false; 
    } 
} 

это работает. Затем я хочу проверить группу участников. Поэтому я делаю:

public static bool IsGroupMember(string username, string sDomain) 
{ 
    List<string> groupList = new List<string>() {"WebDeveloper", "SyncDeveloper"}; 
    using (System.Web.Hosting.HostingEnvironment.Impersonate()) 
    { 
     try 
     { 
      PrincipalContext domain = new PrincipalContext(ContextType.Domain, sDomain); 
      UserPrincipal user = UserPrincipal.FindByIdentity(domain, IdentityType.SamAccountName, username); 

      foreach (string groupname in groupList) 
      { 
       var group = GroupPrincipal.FindByIdentity(domain, groupname); 
       if (group != null) 
       { 
        if (group.GetMembers(true).Any(member => user.SamAccountName.ToLower() == member.SamAccountName.ToLower())) 
        { 
         return true; 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      ASTools.LogError(ex.ToString()); 
     } 
    } 
    return false; 
} 

В локальный он работает, но когда я публикую оно не и эта ошибка возникает:

System.DirectoryServices.DirectoryServicesCOMException (0x80072020): An operations error occurred. 
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, IdentityType identityType, String identityValue) 
at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue) 
at ASActiveDirectory.IsGroupMember(String username, String sDomain) in c:\inetpub\Applicazioni\DeviceManage\App_Code\ASActiveDirectory.cs:line 78 

Я пытался добавить

using (System.Web.Hosting.HostingEnvironment.Impersonate()) 

, а также

<identity impersonate="true"/> 

затем я попытался изменить личность моего пула до NetworkService и LocalSystem, но ничего не изменилось. Я не понимаю, почему в моем собственном ПК все работает нормально даже с ApplicationPoolIdentity .. Я знаю, что этот вопрос задан много раз, но я пробовал каждое предложение, которое я нашел, и они не работают для меня .. Пожалуйста, помогите мне!

ответ

0

мне пришлось добавить имя пользователя и пароль в PrincipalContext:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domain, username, password); 
Смежные вопросы