Олицетворение для обновления информации AD пользователя на сайте с проверкой подлинности с помощью форм ASP.NET - PullRequest
2 голосов
/ 29 июля 2011

У нас есть интрасеть с проверкой подлинности с помощью форм, которая запрашивает AD для входа в систему и сохраняет копию идентификатора Windows в сеансе, чтобы позже выдать себя за пользователя при обновлении его записи AD.Мы не можем использовать Windows Auth для олицетворения (длинная история).

Итак, код входа:

[DllImport("advapi32.dll")]
        public static extern bool LogonUser(String
            lpszUsername, String lpszDomain,
            String lpszPassword, int dwLogonType, int
                dwLogonProvider, out int phToken);

        public bool LoginWindowsUser(String domain, String username, String pwd, HttpSessionStateBase session)
        {

            int ret = 0;
            int l_token1;
            bool loggedOn = LogonUser(username,
                domain, pwd,
                // Logon type=LOGON32_LOGON_NETWORK_CLEARTEXT.
            3,
                // Logon provider=LOGON32_PROVIDER_DEFAULT.
            0,
                // User token for specified user is returned 
                //here.
            out l_token1);

            if (loggedOn)
            {
                IntPtr token2 = new IntPtr(l_token1);
                var l_Wid = new WindowsIdentity(token2);


                session["WindowsIdentity"] = l_Wid;
            }
            return loggedOn;
        }

А потом, когда нам нужно обновить информацию AD пользователя, мы делаем это:

public void UpdateUserProperty(string username, string propertyName, string propertyValue)
        {
            // Obtain the authenticated user's identity.
            var winId = (WindowsIdentity) ControllerContext.HttpContext.Session["WindowsIdentity"];
             // Start impersonating.
            using (WindowsImpersonationContext ctx = winId.Impersonate())
            {
                try
                {
                    var ds = new DirectorySearcher();
                    int ind = username.IndexOf("\\") + 1;
                    username = username.Substring(ind, username.Length - ind);

                    var filter = "(&(objectCategory=Person)(objectClass=user)";

                    if (!username.IsNullOrEmpty())
                    {
                        filter += "(samaccountname=*{0}*)".F(username);
                    }

                    filter += ")";

                    ds.Filter = filter;

                    foreach (var property in ADUserDetailsDisplay.LoadProperties())
                    {
                        ds.PropertiesToLoad.Add(property);
                    }

          ///////////// ERROR OCCURS AFTER NEXT LINE /////////////

                    var searchResult = ds.FindOne();

                    var userDirectoryEntry = searchResult.GetDirectoryEntry();

                    if (propertyValue.IsNullOrEmpty())
                    {
                        if (userDirectoryEntry.Properties[propertyName].Count > 0) userDirectoryEntry.Properties[propertyName].RemoveAt(0);
                    }
                    else if (userDirectoryEntry.Properties[propertyName].Count == 0)
                    {
                        userDirectoryEntry.Properties[propertyName].Add(propertyValue);
                    }
                    else
                    {
                        userDirectoryEntry.Properties[propertyName][0] = propertyValue;
                    }
                    userDirectoryEntry.CommitChanges();


                }
                catch (Exception ex)
                {
                    TempData.AddErrorMessage("Unable to update user: " + ex.Message);
                }
                finally
                {
                    // Revert impersonation.
                    if (ctx != null)
                        ctx.Undo();
                }
            }
            // Back to running under the default ASP.NET process identity.

        }

Проблема в том, что мы получаем следующую ошибку:

Невозможно обновить пользователя: произошла ошибка операций.

Еслилюбой может подсказать мне решение, я был бы очень признателен.

Использование IIS 7.5 Win2008 R2 ASP.NET MVC2

Спасибо.

Ответы [ 3 ]

0 голосов
/ 29 июля 2011

Работа с AD иногда представляет собой PIA.

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

0 голосов
/ 29 июля 2011

Где находится ваш контекст / searchroot, который сообщает, к кому вы пытаетесь подключиться / где вы пытаетесь найти?

Ex.

// Bind to the users container.
DirectoryEntry entry = new DirectoryEntry("LDAP://CN=users,DC=fabrikam,DC=com");
// Create a DirectorySearcher object.
DirectorySearcher mySearcher = new DirectorySearcher(entry);

Если у вас этого нет, то в соответствии с MSDN значение по умолчанию для SearchRoot равно нулю ... MSDN Link: http://msdn.microsoft.com/en-us/library/h9zyssd8.aspx

0 голосов
/ 29 июля 2011

Наш собственный @dunnry рассмотрел шаги по запуску System.DirectoryServices с олицетворением в ASP.NET:

Здесь вам может помочь Райанн Данн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...