Аутентификация LDAP в ASP.NET MVC: ошибка аутентификации: «Учетные данные по умолчанию не поддерживаются, если для защиты соединения установлено значение Нет» - PullRequest
1 голос
/ 29 января 2012

Я пытаюсь внедрить аутентификацию LDAP на сервере ADAM LDAP моей компании с ASP.NET MVC.

Я уже проверил координаты и учетные данные с другими клиентами LDAP, и они работают нормально.Сервер не защищен SSL, и он работает на стандартном порте 389, поэтому я устанавливаю connectionProtection = "None" в поставщике членства web.config.

Когда я пытаюсь войти со страницей входа по умолчанию, я получаю ошибка: «Учетные данные по умолчанию не поддерживаются, если для защиты соединения установлено значение Нет» * .

Вот части web.config

<configuration>
  <connectionStrings>
    <add name="ADConnectionString"    connectionString="LDAP://mycompanyldapserver.com:389"/>

  ....

<membership defaultProvider="DefaultMembershipProvider">
  <providers>
    <add name="DefaultMembershipProvider"
         type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
         connectionStringName="ADConnectionString"
         connectionProtection="None"
         attributeMapUsername="sAMAccountName"
         enableSearchMethods="True"/>
  </providers>
</membership>

AccountController

    [AllowAnonymous]
    [HttpPost]
    public JsonResult JsonLogOn(LogOnModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            // >> Membership.ValidateUser THROWS EXCEPTION AFTER LOGIN TRY >>
            if (Membership.ValidateUser(model.UserName, model.Password)) 
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                return Json(new { success = true, redirect = returnUrl });
            }

РЕДАКТИРОВАТЬ

Я обнаружил, что исключение «Учетные данные по умолчанию не поддерживаются, когда для защиты соединения установлено значение Нет», это неВыдается, когда я добавляю эти параметры в DefaultMembershipProvider:

connectionUsername="username"
connectionPassword="userpwd"

Проблема в том, что имя пользователя и пароль должны изменить время выполнения, основываясь на форме входа в систему ... Можете ли вы помочь мне установить эти параметры времени выполнения, пожалуйста?Я попытался реализовать это решение, которое, как я полагаю, могло бы работать ... Я полагаю, потому что теперь я получаю ошибку "неправильное имя пользователя или пароль" вместо указанного выше исключения, указанного в теме.Я думаю, что я в шаге от решения этой проблемы, в любом случае мне нужна помощь какого-то эксперта.Я не знаю, если следующее решение может работать должным образом для проверки пользователя:

МОДИФИЦИРОВАННЫЙ КОНТРОЛЛЕР СЧЕТА: Я ПЫТАЮСЯ ДОБАВИТЬ УЧАСТНИК ПОСТАВЩИКА ЧЛЕНСТВА

    [AllowAnonymous]
    [HttpPost]
    public JsonResult JsonLogOn(LogOnModel model, string returnUrl)
    {

        // I'm trying to add membership provider runtime...

        System.Web.Security.ActiveDirectoryMembershipProvider mprov = new System.Web.Security.ActiveDirectoryMembershipProvider();

        NameValueCollection objConfig = new NameValueCollection();
        objConfig.Add("name", "DefaultMembershipProvider");
        objConfig.Add("type", "System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
        objConfig.Add("connectionStringName", "ADConnectionString");
        objConfig.Add("connectionProtection", "None");
        objConfig.Add("connectionUsername", model.UserName);
        objConfig.Add("connectionPassword", model.Password);
        objConfig.Add("attributeMapUsername", "sAMAccountName");
        objConfig.Add("enableSearchMethods", "True");

        try
        {
            // Here I get "wrong username or password error...wrong DN base? I do not know.....
                 mprov.Initialize(objConfig["name"], objConfig);
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                return Json(new { success = true, redirect = returnUrl });
        }

        catch (System.Runtime.InteropServices.COMException ex)
        {
            // For now I am catching all COMExceptions...if it works I could change behavior...
            ModelState.AddModelError("", ex.Message);

        }

Спасибо взаранее за вашу драгоценную помощь.

1 Ответ

2 голосов
/ 30 января 2012

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

Основной проблемой была следующая ошибка: « Учетные данные по умолчанию не поддерживаются, если для защиты соединения установлено значение Нет ». Когда DefaultMembershipProvider имеет connectionProtection = "None", для него необходимо установить connectionUsername и connectionPassword :

web.config

     <membership defaultProvider="DefaultMembershipProvider">
     <providers>
        <add name="DefaultMembershipProvider"
        type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        connectionStringName="ADConnectionString"
        connectionProtection="None"
        connectionUsername="username"
        connectionPassword="userpwd"
        attributeMapUsername="sAMAccountName"
        enableSearchMethods="True"/>
      </providers>
      </membership>

Вторая проблема заключалась в том, что я использую LDAP для аутентификации, поэтому я не хотел использовать статические connectionUsername и connectionPassword. Поэтому я решил определить всю среду выполнения MembershipProvider , изменив действие JsonLogOn контроллера учетной записи (действие LogOn следует изменить аналогичным образом):

КОНТРОЛЛЕР СЧЕТА / ЛОГИН

    // POST: /Account/JsonLogOn

    [AllowAnonymous]
    [HttpPost]
    public JsonResult JsonLogOn(LogOnModel model, string returnUrl)
    {
        System.Web.Security.ActiveDirectoryMembershipProvider mprov = new System.Web.Security.ActiveDirectoryMembershipProvider();
        string baseDN = "OU=myou,OU=myou1,O=myO";
        NameValueCollection objConfig = new NameValueCollection();
        objConfig.Add("name", "DefaultMembershipProvider");
        objConfig.Add("type", "System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
        objConfig.Add("connectionStringName", "ADConnectionString");
        objConfig.Add("connectionProtection", "None");
        objConfig.Add("connectionUsername", "uid=" + model.UserName + "," + baseDN);
        objConfig.Add("connectionPassword", model.Password);
        objConfig.Add("attributeMapUsername", "sAMAccountName");
        objConfig.Add("enableSearchMethods", "True");

        try
        {
            mprov.Initialize(objConfig["name"], objConfig);

        }

        catch (System.Runtime.InteropServices.COMException ex)
        {
            switch (ex.ErrorCode)
            {
                // Server give back a value...
                case -2147016661:
                    {
                        FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                        return Json(new { success = true, redirect = returnUrl });
                    }
            }
            ModelState.AddModelError("", ex.Message);
        }

        // If we got this far, something failed
        return Json(new { errors = GetErrorsFromModelState() });
    }

Et voilà! Работает нормально, по крайней мере для моих нужд! :) Я надеюсь, что это может помочь кому-то еще ... Пожалуйста, проголосуйте, если вы найдете это решение полезным , спасибо. Я потратил несколько часов, чтобы найти его ... не нашел ничего готового в сети.

Спасибо! С наилучшими пожеланиями

...